web-dev-qa-db-ja.com

android)のMediaStore.ACTION_IMAGE_CAPTUREインテントで画像をキャプチャする

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();
                }
            }

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

前もって感謝します。

サティシュ

10
sathish

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

公式のAndroidガイドはその例を示しています: http://developer.Android.com/guide/topics/media/camera.html#intent-receive しかしそれはすべてのデバイスで機能するわけではありません。

私が知っている唯一の信頼できる方法は、画像へのパスをローカル変数に保存することです。バックグラウンド(カメラアプリの実行中)でアプリが強制終了される可能性があるため、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以外のインテントを取得する場合は、fileNameよりもintent.getData()を優先する必要があります。 fileNameは、必要な場合にのみバックアップソリューションとして使用してください。

32
Rémi

私の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");
    }
}
4
IgorGanapolsky