11

MediaStore.ACTION_IMAGE_CAPTURE インテントを使用して画像をキャプチャしています。ほとんどのデバイスで正常に動作しています。しかし、一部の最新の Android デバイスでは期待どおりに正しく動作しません。

私の意図は、カメラを使用して画像をキャプチャしてサーバーに送信することですが、その画像をデバイスのデフォルトのギャラリーに保存することではありません。

* * : 画像をキャプチャすると、一部の最新の Android デバイスでキャプチャされた画像ではなく、onActivityResult メソッドで他のギャラリー画像が返されます。以下のコードを使用して、画像をキャプチャして保存しています。

public void launchCamera(View v) {
    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camera, CAMERA_PIC_REQUEST );
}

onActivityResult メソッドでは、

String[] projection = { MediaStore.Images.ImageColumns.SIZE,
                    MediaStore.Images.ImageColumns.DISPLAY_NAME,
                    MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, };
            Cursor c = null;
            Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            try {
                if (u != null) {
                    c = managedQuery(u, projection, null, null, null);
                }
                if ((c != null) && (c.moveToLast())) {
                    Bitmap thumbnail = getBitMapFromLocalPath(c.getString(2), 3);
                    idsImagesgot.add(thumbnail);
                    ContentResolver cr = getContentResolver();
                    cr.delete( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            BaseColumns._ID + "=" + c.getString(3), null);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }

この点で誰でも私を助けることができますか?

前もって感謝します。

サティッシュ

4

2 に答える 2

34

ACTION_IMAGE_CAPTURE で撮影した写真は、すべてのデバイスで自動的に MediaStore に登録されるわけではありません。

公式の Android ガイドにその例 示されています。

私が知っている唯一の信頼できる方法は、画像へのパスをローカル変数に保存することです。バックグラウンドで (カメラ アプリの実行中に) アプリが強制終了される可能性があることに注意してください。そのため、onSaveInstanceState 中にパスを保存する必要があります。

コメント後に編集:

インテントの開始時に写真が保存される一時ファイル名を作成します。

File tempFile = File.createTempFile("my_app", ".jpg");
fileName = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PICTURE_REQUEST_CODE);

fileNameアクティビティのフィールドである文字列です。次のように保存する必要があります。

@Override
public void onSaveInstanceState(Bundle bundle)
{
 super.onSaveInstanceState(bundle);
 bundle.putString("fileName", fileName);
}

onCreate() でそれを回復します。

public void onCreate(Bundle savedInstanceState)
{
 if (savedInstanceState != null)
  fileName = savedInstanceState.getString("fileName");
 // ...
}

これで、onActivityResult の時点で、写真が保存されたファイルの名前がわかります ( fileName)。好きなことをしてから削除できます。

2013-09-19 編集: 一部のカメラ アプリは putExtra uri を無視して、写真を別の場所に保存しているようです。したがって、値を使用する前にfileName、インテントが null かどうかを確認する必要があります。null 以外のインテントを取得した場合は、より優先する必要がありintent.getData()ますfileNamefileName必要な場合にのみ、バックアップ ソリューションとして使用してください。

于 2012-10-18T11:32:49.650 に答える
4

私の onActivityResult() メソッドは次のようになり、MediaStore.ACTION_IMAGE_CAPTUREから画像を取得する際に機能します。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");
    }
}
于 2014-01-07T22:17:37.563 に答える