Aufgenommenes Bild zuschneiden

  • Antworten:6
Patrick W.
  • Forum-Beiträge: 49

22.11.2012, 20:10:00 via Website

Guten Abend

Ich habe ein Problem mit meiner App und hoffe das ihr mir helfen könnt. Ich würde gerne ein Bild mit der Kamera aufnehmen, dieses zuschneiden und anschliessend in der App anzeigen lassen. Sobald ich die App ausführe und ich auf den Button klicke wird die Kamera auch gestartet, doch nachdem ich das Bild aufgenommen habe komme ich einfach zur App zurück. Was muss ich machen damit nach der Aufnahme direkt das zuschneiden gestartet wird? Auf Linie 38 wird mir von Eclipse angezeigt: The method onActivityResult(int, int, Intent) from the type new View.OnClickListener(){} is never used locally

So sieht der Quellcode aus:

1import android.net.Uri;
2import android.os.Bundle;
3import android.provider.MediaStore;
4import android.app.Activity;
5import android.content.ActivityNotFoundException;
6import android.content.Intent;
7import android.graphics.Bitmap;
8import android.view.Menu;
9import android.view.View;
10import android.widget.Button;
11import android.widget.ImageView;
12import android.widget.Toast;
13
14
15public class MainActivity extends Activity {
16
17 final int Aufnahme = 1;
18 private Uri bildUri;
19 final int PIC_CROP = 2;
20
21 @Override
22 public void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.activity_main);
25
26 Button startButton = (Button) findViewById(R.id.cameraButton);
27
28 startButton.setOnClickListener(new View.OnClickListener() {
29
30 public void onClick(View v) {
31 if (v.getId() == R.id.cameraButton) {
32 //Ruft die Kamera auf
33 Intent cameraIntent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE);
34 startActivityForResult(cameraIntent, Aufnahme);
35 }
36 }
37
38 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
39 //Überprüft den von der Kamera zurückgegebenen wert
40 if (resultCode == RESULT_OK) {
41 if(requestCode == Aufnahme){
42 bildUri = data.getData();
43 //führt die zuschneiden Action aus
44 performCrop();
45 }
46 else if(requestCode == PIC_CROP){
47 Bundle extras = data.getExtras();
48 Bitmap finalesBild = extras.getParcelable("data");
49 ImageView anzeigeBild = (ImageView)findViewById(R.id.picture);
50 anzeigeBild.setImageBitmap(finalesBild);
51 }
52 }
53 }
54
55 private void performCrop(){
56 try {
57 Intent cropIntent = new Intent("com.android.camera.action.CROP");
58 cropIntent.setDataAndType(bildUri, "image/*");
59 cropIntent.putExtra("crop", "true");
60 cropIntent.putExtra("aspectX", 1);
61 cropIntent.putExtra("aspectY", 1);
62 cropIntent.putExtra("outputX", 256);
63 cropIntent.putExtra("outputY", 256);
64 cropIntent.putExtra("return-data", true);
65 startActivityForResult(cropIntent, PIC_CROP);
66 }
67 //Gibt eine Warnmeldung aus wenn das Gerät die zuschneiden Funktion nicht unterstützt
68 catch(ActivityNotFoundException anfe){
69 String errorMessage = "Dein Smartphone kann das Bild nicht zuschneiden";
70 Toast errorMessageCROP = Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_SHORT);
71 errorMessageCROP.show();
72 }
73 }
74
75 });
76 }
77
78 @Override
79 public boolean onCreateOptionsMenu(Menu menu) {
80 getMenuInflater().inflate(R.menu.activity_main, menu);
81 return true;
82 }
83}

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

23.11.2012, 10:24:17 via Website

A: Was sagt dein Debugger ?
B: Eclipse kann nicht wissen das onActivityResult vom System aufgerufen wird.
C: http://stackoverflow.com/questions/5991319/capture-image-from-camera-and-display-in-activity


Noch was:

40 if (resultCode == RESULT_OK) {
41 if(requestCode == Aufnahme){

Scheint mir das Problem zu sein, ein Debugger hätte dir das in 2 Minuten gezeigt.

— geändert am 23.11.2012, 10:32:34

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mark
  • Forum-Beiträge: 10

23.11.2012, 16:15:39 via Website

ändere mal

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
in

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
An der Stelle wird die Methode der Elternklasse nicht überschrieben und deshalb der Code nicht ausgeführt.

Antworten
Mark
  • Forum-Beiträge: 10

23.11.2012, 16:22:21 via Website

Mac Systems

B: Eclipse kann nicht wissen das onActivityResult vom System aufgerufen wird.
Eclipse weis das schon, das Problem ist eher das die Methode nicht überschrieben wird. D.h. Eclipse erkennt an der Stelle das der Code niemals ausgeführt werden kann und wirft deshalb die Warnung.

Mac Systems

40 if (resultCode == RESULT_OK) {
41 if(requestCode == Aufnahme){

Scheint mir das Problem zu sein, ein Debugger hätte dir das in 2 Minuten gezeigt.
Der Code sieht soweit schon richtig aus, auch wenn Aufnahme in Großbuchstaben geschrieben werden sollte (Java Code Conventions).

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

23.11.2012, 22:45:02 via Website

Jungs, ob da ne @Override Annotation dran ist oder nicht, ist egal. Sie dient dazu Eclipse die Absicht zu zeigen. Gibt es die Methode nicht die man überschreiben will meldet Eclipse das.

Sicher schreibt man Konstanten wie diese groß, aber, jedesmal einen Code review hier abzuhalten würde mich Jahre kosten bei dem was Ich hier täglich so (mit)lesen muss.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Patrick W.
  • Forum-Beiträge: 49

24.11.2012, 17:00:47 via Website

Danke für eure Hilfe, das Problem war das protected void onActivityResult im public void onCreate drin war.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

24.11.2012, 19:24:24 via Website

Und das hat Kompiliert ?

PS: Na, AndroidPit kümmert sich ja weiterhin einen schei** drum hier eine ordentliches Syntax Highlighting und Formatierung von Code bereitzustellen, wichtig ist nur ob Device XYZ in schwarz oder weiß verfügbar wird.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

San Blarnoi

Antworten