2017-10-20 11 views
-1

イメージをキャプチャするためのカメラの意図を持つAndroidアプリを開発しています。私のアプリはどんな向きにも限定されていないので、ユーザーは両方のアプリケーションでクラッシュし、縦書きで起動し、横長の画像を撮り、横長のOKを押すとアプリケーションがクラッシュする。ポートレートと風景の向きが違うので、私のマニフェストで:android:configChanges = "orientation | keyboardHidden | screenSize"を使いたくありません。私は "savedInstanceState"を使用しようとしましたが、保存する必要のあるデータと保存されたインスタンスを呼び出す必要がある場所がわからないため、成功しませんでした。オリエンテーションの変更が発生したときにsavedInstanceStateを使用してカメラ情報を保存する方法

エラー: java.lang.RuntimeException:アクティビティを再開できません{.MainActivity}:java.lang.RuntimeException:結果の配信に失敗しましたResultInfo {who = null、request = 0、result = -1、data =活性{.MainActivity}にヌル}:java.lang.NullPointerExceptionが:

注 保護ボイドonActivityResult(INT requestCode、INT resultCodeが、インテントデータ){:撮像画像における意図を介して別のアクティビティに送信します ... }

ここに私のコードです:

takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        if (takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) { 
         File exportDir = new File(Environment.getExternalStorageDirectory(), "TempFolder"); 
         if (!exportDir.exists()) { 
          exportDir.mkdirs(); 
         } else { 
          exportDir.delete(); 
         } 
         mTempCameraPhotoFile = new File(exportDir, "/" + UUID.randomUUID().toString().replaceAll("-", "") + ".jpg"); 
         Log.d(TAG, "path to file: " + "/" + UUID.randomUUID().toString().replaceAll("-", "") + ".jpg"); 
         takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempCameraPhotoFile)); 
         startActivityForResult(takePictureIntent, REQUEST_CAMERA); 
        } 


onActivityResult 

if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) { 

       Intent intent = new Intent(MainActivity.this, CameraActivity.class); 
       //intent.putExtra("ID_EXTRA", new String[] { bytes.toByteArray(), "Load_Image"}); 
       intent.putExtra("imageUri", Uri.fromFile(mTempCameraPhotoFile)); 

       //intent.putExtra("imageUri", outputFileUri); 
       intent.putExtra("Title", "Take_Image"); 
       startActivity(intent); 
+0

ローテーション後にnullになる変数インスタンスを使用しています。使用前にヌルを確認してください。あなたのアプリはNullPointerException is notでクラッシュしますか? – greenapps

+0

はい、データがnullになり、カメラからデータを保存する方法がわからない場合はnull値が原因です。私がconfigChanges = orientationを使用すると、これは問題を解決しますが、私はこれを使いたくありません。 – Nani

+0

私はIgorがonSaveInstanceState()を使ってコメントを削除した理由を知りました。 – greenapps

答えて

0

この質問の回答時にオリエンテーション画像のURIを保存し、復元することによってです変更:

protected void onSaveInstanceState(Bundle outState) 
    { 
     outState.putParcelable("outputFileUri", outputFileUri); 
    } 

if (savedInstanceState != null) 
     { 
      outputFileUri= savedInstanceState.getParcelable("outputFileUri"); 
     } 

回答がありますsリンク: Answer

1

以下にようonSavedInstanceState()状態を保存します。

static final String STATE_SCORE = "playerScore"; 
static final String STATE_LEVEL = "playerLevel"; 
... 


@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 


    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

をしてからonCreate()またはonRestoreInstanceState()でそれを復元します。

のonCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // Always call the superclass first 


    // Check whether we're recreating a previously destroyed instance 
    if (savedInstanceState != null) { 
     // Restore value of members from saved state 
     mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
    } else { 
     // Probably initialize members with default values for a new instance 
    } 
    ... 
} 

onRestoreInstanceStateがonStart()後に呼び出され、あなたがここに値を復元することができます。

public void onRestoreInstanceState(Bundle savedInstanceState) { 
// Always call the superclass so it can restore the view hierarchy 
super.onRestoreInstanceState(savedInstanceState); 


// Restore state members from saved instance 
mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} 
+0

非常に役に立ちますが、問題はカメラにあります。どのようにデータを保存し、どのタイプの変数を割り当てる必要がありますか? – Nani

関連する問題