2011-09-01 13 views
18

私は自分のアクティビティからデフォルトのカメラを呼び出してから、onActivityResultを処理しています。私のコードは、写真が撮られたときに確認を持っていないLGアリーでうまくいくようです。しかし、Nexus Sで同じアプリを実行すると、アクティビティに戻る前に「OK」、「Retake」、「Cancel」と表示されます。 「キャンセル」は機能しますが、画像を保存せずに自分のアクティビティに戻っても、「OK」は何の効果もないように見えます。デフォルトのカメラアクティビティが終了しないOKボタンを押したとき

以下の私のコード:

private void captureImage() { 

    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + (new UserContextAdapter(this)).getUser() + "/"); 
     path.mkdirs(); 
     File file = new File(path, "Image_Story_" + mRowId.toString() + ".jpg"); 

     newImageUri = Uri.fromFile(file); 

     Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, newImageUri); 

     startActivityForResult(intent, CAPTURE_IMAGE); 
    } 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

    switch (requestCode) { 
    case CAPTURE_IMAGE: 
     switch (resultCode) { 
     case 0: 
      Log.i("CAPTURE", "Cancelled by User"); 
      break; 
     case -1: 
      mImageUri = newImageUri; 
      setImageFromUri(); 
      } 
    } 
+0

あなたがストレージ許可を与えていることを確認してください –

答えて

15

私はちょうど正確に同じ問題を抱えていたと思います。

画像を保存するパスが正しくない場合、カメラはあなたのアプリに戻りません。ディレクトリが存在することを確認したら、すべて正常に機能しました。ディレクトリが存在することを確認してから、動作するはずです。

- 編集 -

私はちょうどあなたがpath.mkdirs();を呼び出すが、私はそれが動作しないことを考えることを、見ました。あなたがアンドロイドの文書で読むことができるように、 "このメソッドは失敗するとIOExceptionを投げないので、呼び出し側は戻り値をチェックする必要があります。"ディレクトリが本当に存在するかどうか確認してください。

HTH

+0

hmm、これはずっと前に私のケースで問題をどのように修正したのか覚えていないのですが、解決策を投稿してくれてありがとうございます^ –

+2

こんにちはRahul、フォルダの存在を確認すると、実際に存在し、そこに画像が保存されますが、OKボタンを押しても私の活動に戻ってこないのです。ですから、@ qedejavuが書いたことは解決策ではないようです。問題をどのように解決したか思い出してください。 –

+2

これは、ネイティブCameraアプリに保存しようとしているディレクトリにアクセスできない場合にも発生します。例えば、あなたのアプリのプライベートストレージはネイティブのカメラアプリにはアクセスできません。 –

1

また、あなたは上記のEnvironment.getExternalStorageDirectory().getPath()を使用している場合、アプリケーションが<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />を持っていることを確認してください。

Uri newImageUri = null; 

File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/"); 

path.mkdirs(); 

boolean setWritable = false; 

setWritable = path.setWritable(true, false); 

File file = new File(path, "Image_Story_" + System.currentTimeMillis() + ".jpg"); 

newImageUri = Uri.fromFile(file); 

Log.i("MainActivity", "new image uri to string is " + newImageUri.toString()); 

Log.i("MainActivity", "new image path is " + newImageUri.getPath());    

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

intent.putExtra(MediaStore.EXTRA_OUTPUT, newImageUri); 

startActivityForResult(intent, REQUEST_CODE_CAPTURE_IMAGE); 

ケース2:

String fileName = "" + System.currentTimeMillis() + ".jpg"; 

ContentValues values = new ContentValues(); 

values.put(MediaStore.Images.Media.TITLE, fileName); 

values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera"); 

values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 

Uri imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

Log.i("MainActivity", "new image uri to string is " + imageUri.toString()); 

Log.i("MainActivity", "new image path is " + imageUri.getPath()); 

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 

startActivityForResult(intent, REQUEST_CODE_CAPTURE_IMAGE); 

私はネクサスにカメラを通して画像を保存することができるよ、これは=を助け

・ホープ)

1

この

ケース1をご確認ください。上記の場合の両方 ケース1の場合: a。画像はカスタムフォルダに保存されます。 b。 "System.currentTimeMillis()"を( "new Date()。toString()"に変更した場合、画像は保存されず、カメラは自分のアクティビティに戻りません。 ( "System.currentTimeMillis"に空白がなく、 "new Date()。toString()"に特殊な文字やスペースがある可能性があります) ケース2の場合: a。画像は、カメラフォルダに保存されているすべての

0

おかげで私は、同じproblem.Youあなたは写真ディレクトリを持っていたりしませんnot.Ifことをあなたの携帯電話のストレージ・チェックで、1つのジョブだけをしなければならないしていますそのようなライブラリを手に入れてください。

これはうまくいきます。