0

カメラ アクティビティを起動し、ユーザーが写真を保存してアプリに戻るときに写真をキャプチャしようとしています。これは、Android 2.2 を実行している携帯電話では問題なく動作しますが、4.1.2 などを実行しているタブレットでは NullPointerException が発生します。

渡された「データ」からビットマップを作成しようとすると、アプリが「onActivityResult」で NullPointerException を取得していることがわかります (明らかにデータが渡されていません)。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    pauseTime = System.currentTimeMillis();
    Log.i(TAG, "Camera result time pauseTime should be reset: " + pauseTime);
    Log.i(TAG, "Camera resultCode is equal to: " + resultCode + " RESULT_OK is: " + RESULT_OK);

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

        try {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
        } catch (Exception e) {
            // Data is null getting sent back
            e.printStackTrace();
        }

logcat のエラーは次のようになります。

07-29 17:16:50.795: W/System.err(19517): java.lang.NullPointerException
07-29 17:16:50.795: W/System.err(19517):    at     com.android.thoughtfi.UsersThoughts.onActivityResult(UsersThoughts.java:163)
07-29 17:16:50.795: W/System.err(19517):    at android.app.Activity.dispatchActivityResult(Activity.java:5391)
07-29 17:16:50.795: W/System.err(19517):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3215)
07-29 17:16:50.795: W/System.err(19517):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3262)
07-29 17:16:50.795: W/System.err(19517):    at android.app.ActivityThread.access$1200(ActivityThread.java:140)
07-29 17:16:50.795: W/System.err(19517):    at     android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
07-29 17:16:50.800: W/System.err(19517):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-29 17:16:50.800: W/System.err(19517):    at android.os.Looper.loop(Looper.java:137)
07-29 17:16:50.800: W/System.err(19517):    at android.app.ActivityThread.main(ActivityThread.java:4947)
07-29 17:16:50.800: W/System.err(19517):    at java.lang.reflect.Method.invokeNative(Native Method)

アプリケーションの onactivityresult に返されるデータがないのはなぜですか?

編集(追加情報については、ここにフォトボタンがあります):

    photoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // possible option
            String fileName = "temp.jpg";
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, fileName);
            mCapturedImageURI = getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
            startActivityForResult(intent, CAMERA_REQUEST);
        }
    });

編集これはうまくいくようですが、タブレットでどのように撮っても写真が横向きモードで表示されます:

onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    pauseTime = System.currentTimeMillis();
    Log.i(TAG, "Camera result time pauseTime should be reset: " + pauseTime);
    Log.i(TAG, "Camera resultCode is equal to: " + resultCode + " ");

    Log.i(TAG, "The intent mCapturedImageURI was: " + mCapturedImageURI);

    Bitmap photo = null;
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
        if(data != null){
            photo = (Bitmap) data.getExtras().get("data");
        } else {
                try {
                    photo = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mCapturedImageURI);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }               
        }

        imageView.setImageBitmap(photo);
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(mCapturedImageURI, projection, null,
                null, null);
        int column_index_data = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        capturedImageFilePath = cursor.getString(column_index_data);

写真ボタン:

photoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // possible option
            String fileName = "temp.jpg";
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, fileName);
            mCapturedImageURI = getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
            startActivityForResult(intent, CAMERA_REQUEST);
        }
    });
4

1 に答える 1

0

カメラのリファレンス ページでは、キャプチャした画像を含むファイルのパスを返すとドキュメントに記載されています。

関連するコード:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(this, "Image saved to: " + data.getData(), Toast.LENGTH_LONG).show();
        } else {
          // whatever
        }
    }

編集: MediaStore.ACTION_IMAGE_CAPTURE の説明から

カメラ アプリケーションで画像をキャプチャして返すために送信できる標準のインテント アクション。

呼び出し元は、このイメージが書き込まれる場所を制御するために、追加の EXTRA_OUTPUT を渡すことができます。EXTRA_OUTPUT が存在しない場合、小さいサイズの画像がビットマップ オブジェクトとして extra フィールドに返されます。これは、小さな画像のみが必要なアプリケーションに役立ちます。EXTRA_OUTPUT が存在する場合、フルサイズの画像が EXTRA_OUTPUT の Uri 値に書き込まれます。

これを理解した場合、Camera アクティビティは次のいずれかを返します。

  • EXTRA_OUTPUT が指定された場合は、完全なイメージの Uri
  • EXTRA_OUTPUTが指定されていない場合は getExtras().get("data") のサムネイル

カメラを起動するインテントで EXTRA_OUTPUT パラメータを指定しましたか?

于 2013-07-29T15:42:17.427 に答える