2013-06-06 22 views
6

写真を選択するためにギャラリーまたはカメラのいずれかを選択するようにピッカーを表示しています。私がカメラを選択すると、カメラがロードされたら風景写真を撮るために回転し、写真を撮り終えたら、それは自分のアプリに戻りますが、返される画像はヌルです。 カメラを回転させないと、画像は正常に戻されます。 私は何が欠けていますか? ローテーションによってアクティビティが再構築されることはわかっていますが、なぜonActivityResultに正しい情報が含まれていないのでしょうか?ここ は私openImageの意向である:カメラが回転している場合、カメラからの画像がヌルです

public void openImageIntent() { 

     // Determine Uri of camera image to save. 
     final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyAppImages" 
       + File.separator); 
     root.mkdirs(); 
     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy-hhmmss"); 
     final String fname = String.format("%s.jpg", sdf.format(new Date())); 
     final File sdImageMainDirectory = new File(root, fname); 
     outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     // Camera. 
     final List<Intent> cameraIntents = new ArrayList<Intent>(); 
     final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     final PackageManager packageManager = getPackageManager(); 
     final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
     for (ResolveInfo res : listCam) { 
      final String packageName = res.activityInfo.packageName; 
      final Intent intent = new Intent(captureIntent); 
      intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
      intent.setPackage(packageName); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
      cameraIntents.add(intent); 
     } 

     // Filesystem. 
     final Intent galleryIntent = new Intent(); 
     galleryIntent.setType("image/*"); 
     galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

     // Chooser of filesystem options. 
     final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 

     // Add the camera options. 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[] {})); 

     startActivityForResult(chooserIntent, SELECT_PICTURE_REQUEST); 
    } 

そしてonActivityResult方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_PICTURE_REQUEST) { 
       final boolean isCamera; 
       if (data == null) { 
        isCamera = true; 
       } else { 
        final String action = data.getAction(); 
        if (action == null) { 
         isCamera = false; 
        } else { 
         isCamera = true; 
        } 
       } 

       Uri selectedImageUri; 
       if (isCamera) { 
        selectedImageUri = outputFileUri; 
       } else { 
        selectedImageUri = data == null ? null : data.getData(); 
       } 

       if (imageDelegate != null) { 
        Log.e(TAG, "imageDelegate not null: " + imageDelegate); 
        imageDelegate.gotNewImageUri(selectedImageUri); 
        imageDelegate = null; 

       } else if (getSupportFragmentManager().findFragmentByTag("addofferdialog") != null) { 
        imageDelegate = (AddOfferFragment) getSupportFragmentManager().findFragmentByTag("addofferdialog"); 
        Log.e(TAG, "imageDelegate is null but found fragment: " + imageDelegate); 
        Log.e(TAG, "Activity image: " + selectedImageUri); 
        imageDelegate.gotNewImageUri(selectedImageUri); 
        imageDelegate = null; 
       } else { 
        Log.e(TAG, "cannot find imageDelegate!!!!"); 
       } 

      Log.e(TAG, "selectedImageUri: " + selectedImageUri); 
      } 
     } 
    } 

答えて

2

あなたがマニフェストにマニフェストファイル

を変更する必要がちょうどコード

<activity android:name=".CameraTestActivity" 
       android:label="@string/app_name"  android:configChanges="keyboardHidden|orientation"> 
の下に置き換えます

コードに

<activity android:name=".CameraTestActivity" 
      android:label="@string/app_name"> 
+0

うわー、それは簡単でした。ありがとう – Darren

+0

それがうまくいけば正直な回答としてください:) – blganesh101

+0

私ができる前に10分待たなければなりませんでした。 – Darren

3

ただ、それは姿勢の変化にnullになりますonSaveInstanceStateoutputFileUriを保存し、賢明な他のonRestoreInstanceStateでそれを復元します。これは私のためによく働い

+0

ありがとうございます。これは動作しますが、マニフェストの変更がアクティビティを損なわれないように保ちながら、はるかに簡単であることがわかりました。 – Darren

+0

とにかく、向きの変更のためにデータを保存してください。 –

+0

@ダーリンそれは簡単ですが、あなたのアプリがメモリのためにバックグラウンドで破壊されたような他の状況でクラッシュしないことを確認するために上記を行う必要があります –

1

..

<activity 
    android:name=".CameraTestActivity" 
    android:configChanges="orientation|screenSize|keyboardHidden"> 
</activity>