39

スタック オーバーフローで関連する問題をすべて検索しても何も見つからない場合は、私を助けてください。

写真をキャプチャするためのインテントを作成しました。次に、別の動作を見ましたonActivityResult():インテントに余分なものを入れない場合(小さな写真の場合)、onActivityResultのインテントは問題ありませんが、写真をファイルに書き込むためのインテントにエクストラを入れると、onActivityResultのインテントですnull

インテントの作成:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// without the following line the intent is ok
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(takePictureIntent, actionCode);

なぜ null なのですか?どうすれば解決できますか?

4

5 に答える 5

65

を提供している場合、私にも同じことが起こりますMediaStore.EXTRA_OUTPUT。意図は無効ですが、提供したファイルに写真が含まれます(Uri.fromFile(f))。

指定しない場合MediaStore.EXTRA_OUTPUT、カメラが写真を保存したファイルの uri を含むインテントが作成されます。

バグかどうかはわかりませんが、そのように動作します。

編集: onActivityResult() では、null の場合はデータをチェックする必要がなくなりました。以下は私と一緒に働いた:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case PICK_IMAGE_REQUEST://actionCode
            if (resultCode == RESULT_OK && data != null && data.getData() != null) {
                //For Image Gallery
            }
            return;

        case CAPTURE_IMAGE_REQUEST://actionCode
            if (resultCode == RESULT_OK) {
                //For CAMERA
                //You can use image PATH that you already created its file by the intent that launched the CAMERA (MediaStore.EXTRA_OUTPUT)
                return;
            }
    }
}

それが役に立てば幸い

于 2012-09-24T12:18:50.167 に答える
1

Kotlin で書かれたサンプル。Uriカメラアプリ用を作成し、カメラCameraFragmentが写真の保存から戻るまでそれを保持し、onActivityResult期待どおりに返します。

CameraFragment.kt

コンシューマー アプリとカメラ アプリの間の仲介者として機能します。入力Uriとして受け取り、 data で返しますIntent

class CameraFragment : Fragment() {

    companion object {
        val TAG = CameraFragment::class.java.simpleName

        private val KEY_URI = ".URI"

        fun newInstance(uri: Uri, targetFragment: Fragment, requestCode: Int): CameraFragment {
            val args = Bundle()
            args.putParcelable(KEY_URI, uri)
            val fragment = CameraFragment()
            fragment.arguments = args
            fragment.setTargetFragment(targetFragment, requestCode)
            return fragment
        }
    }

    private lateinit var uri: Uri

    private var fired = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true

        fired = savedInstanceState?.getBoolean("fired") ?: false

        if (!fired) {
            val args = arguments
            uri = args.getParcelable(KEY_URI)

            val i = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            i.putExtra(MediaStore.EXTRA_OUTPUT, uri)
            i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
            context.grantUriPermission(i, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

            startActivityForResult(i, targetRequestCode)
            fired = true
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putBoolean("fired", fired)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == targetRequestCode) {
            context.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

            val newData = Intent()
            newData.data = uri
            targetFragment.onActivityResult(requestCode, resultCode, newData)

            dismiss()
        }
    }

    private fun dismiss() {
        fragmentManager.beginTransaction().remove(this).commit()
    }
}

/** Grant Uri permissions for all camera apps. */
fun Context.grantUriPermission(intent: Intent, uri: Uri, modeFlags: Int) {
    val resolvedIntentActivities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    for (resolvedIntentInfo in resolvedIntentActivities) {
        val packageName = resolvedIntentInfo.activityInfo.packageName;
        grantUriPermission(packageName, uri, modeFlags);
    }
}

カメラの意図を呼び出す

thisカメラをトリガーするアプリ内のフラグメントです。RC_CAMERAは、このアクションのリクエスト コードです。

val uri = /* Your output Uri. */
val f = CameraFragment.newInstance(uri, this, RC_CAMERA)
fragmentManager.beginTransaction().add(f, CameraFragment.TAG).commit()

カメラの結果を処理する

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    when(requestCode) {
        RC_CAMERA -> {
            if (resultCode == Activity.RESULT_OK) {
                val uri = data?.data
                // Do whatever you need.
            }
        }
    }
}
于 2016-05-12T23:12:02.070 に答える
0

の はどこで作成しfましたUri.fromFile(f)か?

有効なFileオブジェクトでなければなりません。行の前に作成してみてくださいEXTRA_OUTPUT

File f = new File("valid path");

次のようなものを試してください:

File file = new File(dataFile);
Uri outFileUri = Uri.fromFile(file);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, outFileUri);
startActivityForResult(intent, TAKE_PHOTO);
于 2012-09-24T12:02:26.543 に答える
-7

以下を使用します。

ビットマップ ビットマップ = data.getExtras().getParcelable("data");

できます。

于 2013-06-21T09:36:57.077 に答える