19

アクティビティからデフォルトのカメラを呼び出してから、onActivityResultを処理しています。私のコードは、写真を撮ったときに確認がないLGAllyで正常に機能しているようです。ただし、Nexus Sで同じアプリを実行すると、アクティビティに戻る前に「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();
            }
    }
4

4 に答える 4

15

まったく同じ問題があったと思います。

写真を保存するパスが正しくない場合、カメラはアプリに戻りません。ディレクトリが存在することを確認したら、すべてが正常に機能しました。ディレクトリが存在することを確認してください。そうすれば、機能するはずです。

- 編集 -

私はあなたが呼ぶのを見たばかりですが、path.mkdirs();それはうまくいかないと思います。android docで読むことができるように、「このメソッドは失敗時にIOExceptionをスローしないことに注意してください。呼び出し元は戻り値を確認する必要があります。」ディレクトリが実際に存在するかどうかを必ず確認してください。

hth

于 2012-02-06T14:44:58.607 に答える
1

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

これがお役に立てば幸いです=)

于 2012-09-07T14:42:38.640 に答える
1

これを確認してください

ケース1:

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の場合:a。画像はカスタムフォルダに保存されます。b。「System.currentTimeMillis()」が(「newDate()。toString()」)に変更された場合、画像は保存されず、カメラは私のアクティビティに戻りません。(おそらく、「System.currentTimeMillis」にスペースがなく、「new Date()。toString()」に特殊文字とスペースが含まれている可能性があるためです)ケース2の場合:a。画像はカメラフォルダに保存されます

ありがとうございます

于 2013-02-11T06:21:23.943 に答える
0

私も同じ問題を抱えています。電話のストレージで、Picturesディレクトリがあるかどうかを確認してください。そのようなライブラリがない場合は、手動で作成してください。

これがあなたのために働くことを願っています。

于 2017-06-11T19:48:16.917 に答える