6

auswählen Ich habe 'SherlockFragmentActivity' mit überschriebenen 'onActivityResult'.onCreate nach onActivityResult aufgerufen, wenn ich Bild aus der Galerie

Ich versuche, Bild von Kamera und Galerie zu erhalten und es zu beschneiden. Das Problem ist, dass ich auf meine Aktivität nicht Fragment nach onActivityResult aufgerufen habe.

... 
      FragmentTransaction t = fragmentManager.beginTransaction(); 
      LogInFragment logFrag = new LogInFragment(); 
      t.replace(R.id.fragment_container, logFrag); 
      t.commit(); 
... 
    @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 

Aktivität Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/fragment_container" 
       android:background="@color/textWhite" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

</RelativeLayout> 

Und ich habe auch 'SherlockFragment', wo ich aufgenommenes Bild:

startImagePickerDialog(this); 


public void startImagePickerDialog() { 
     AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(getSherlockActivity()); 
     myAlertDialog.setTitle("Upload Pictures Option"); 
     myAlertDialog.setMessage("How do you want to set your picture?"); 

     myAlertDialog.setPositiveButton("Gallery", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface arg0, int arg1) { 
       Intent intent = new Intent(); 
       // call android default gallery 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       // ******** code for crop image 
       intent.putExtra("crop", "true"); 
       intent.putExtra("aspectX", 1); 
       intent.putExtra("aspectY", 1); 
       intent.putExtra("outputX", 200); 
       intent.putExtra("outputY", 200); 
       intent.putExtra("noFaceDetection", true); 
       try { 
        intent.putExtra("return-data", true); 
        startActivityForResult(Intent.createChooser(intent, 
          "Complete action using"), Const.GALLERY_PICTURE); 
       } catch (ActivityNotFoundException e) { 
        Log.e(LOG_TAG, "ActivityNotFoundException"); 
       } 
      } 
     }); 
     myAlertDialog.setNegativeButton("Camera", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface arg0, int arg1) { 
       // call android default camera 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, 
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()); 
       intent.putExtra("crop", "true"); 
       intent.putExtra("aspectX", 1); 
       intent.putExtra("aspectY", 1); 
       intent.putExtra("outputX", 200); 
       intent.putExtra("outputY", 200); 
       intent.putExtra("noFaceDetection", true); 
       try { 
        intent.putExtra("return-data", true); 
        startActivityForResult(intent, Const.CAMERA_REQUEST); 
       } catch (ActivityNotFoundException e) { 
        Log.e(LOG_TAG, "ActivityNotFoundException"); 
       } 
      } 
     }); 
     myAlertDialog.show(); 
    } 

Und 'onActivityResult' in 'SherlockFragment':

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Log.d(LOG_TAG, "onActivityResult"); 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode != getSherlockActivity().RESULT_OK) { 
      Log.e(LOG_TAG, "resultCode != RESULT_OK"); 
      return; 
     } 

     if (requestCode == Const.CAMERA_REQUEST) { 
      Log.d(LOG_TAG, "requestCode == CAMERA_REQUEST"); 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
       Log.d(LOG_TAG, "extras != null"); 
       Bitmap photo = extras.getParcelable("data"); 
       icon.setImageBitmap(photo); 
      } 
     } 

     if (requestCode == Const.GALLERY_PICTURE) { 
      Log.d(LOG_TAG, "requestCode == GALLERY_PICTURE"); 
      Bundle extras2 = data.getExtras(); 
      if (extras2 != null) { 
       Log.d(LOG_TAG, "extras != null"); 
       Bitmap photo = extras2.getParcelable("data"); 
       icon.setImageBitmap(photo); 
      } 
     } 
    } 

UPDATE Wenn ich die Kameraaktivität anrufe, rufe meine Hauptaktivität 'onSaveInstanceState' und danach 'onRestoreInstanceState' auf. Ist das ein Grund?

Antwort

0

versuchen, wie diese

ändern

Bitmap photo = extras.getParcelable("data"); 

Um

Bitmap photo=(Bitmap) intent.getExtras().get("data"); 

Editiert: -

@Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      Log.d(LOG_TAG, "onActivityResult"); 
      super.onActivityResult(requestCode, resultCode, data); 

      if (resultCode != getSherlockActivity().RESULT_OK) { 
       Log.e(LOG_TAG, "resultCode != RESULT_OK"); 
       return; 
      } 

      if (requestCode == Const.CAMERA_REQUEST) { 
       Log.d(LOG_TAG, "requestCode == CAMERA_REQUEST"); 
       Bitmap photo=(Bitmap) intent.getExtras().get("data");// Changed Here 
       icon.setImageBitmap(photo); 

      } 

      if (requestCode == Const.GALLERY_PICTURE) { 
       Log.d(LOG_TAG, "requestCode == GALLERY_PICTURE"); 
       Uri imageUri= intent.getData();// Changed Here, or first decode the image to Avoid OutOfMemory Error 
       icon.setImageURI(imageUri); 
      } 
     } 
+1

Das Problem in anderen nicht in Bild zu bekommen. – Val

0

Bitte ersetzen

frag.startActivityForResult(...); 

In Ihrem Fragmente mit

startActivityForResult(...) 
+0

Ich habe diesen Code entfernt, aber das gleiche Ergebnis erhalten. – Val

9
  1. Prüfen Sie die "Einstellungen" -> "Entwickleroptionen" -> "Do Aktivitäten nicht halten" Flagge.
  2. Dies ist die Natur von Android, wenn Ihr Gerät Speicher benötigt zerstört es Aktivitäten, die nicht sichtbar sind. Sie müssen also bedenken, dass Ihre Aktivität jederzeit neu erstellt werden kann. Übrigens gibt es die Option "Aktivitäten nicht beibehalten", um Ihre Anwendung zu simulieren, wenn Ihr Gerät Speicher benötigt und Ihre Backstack-Aktivitäten zerstört.
+0

Ich erstelle Code für alle Telefone nicht nur Telefone mit diesem Flag. – Val

+0

Ich konnte Ihren Kommentar nicht verstehen. Geräte mit Android 4.0 und höher verfügen über die Option Aktivitäten nicht beibehalten. Wenn es auf einem Gerät ausgewählt ist, werden Ihre Backstack-Aktivitäten zerstört und neu erstellt. Überprüfen Sie einfach Ihr Testgerät und stellen Sie sicher, dass dies nicht der Grund für Ihr Problem ist. – Devrim

+0

@aegean charmante Lösung –

Verwandte Themen