Stack Overflowで関連するすべての問題を多く検索し、何も見つからなかった後、私を助けてください。
写真をキャプチャするインテントを作成しました。次に、onActivityResult()
で異なる動作を見ました:Intentに余分なものを入れない場合(小さな写真の場合)、onActivityResultのIntentは問題ありませんが、ファイルの場合、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);
なぜヌルであり、どのように解決できますか?
_MediaStore.EXTRA_OUTPUT
_を提供している場合、意図はnullですが、提供したファイルに写真があります(Uri.fromFile(f)
)。
_MediaStore.EXTRA_OUTPUT
_を指定しない場合、カメラが写真を保存したファイルからのURIを含むインテントがあります。
バグかどうかはわかりませんが、そのように機能します。
EDIT: 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;
}
}
}
_
それが役に立てば幸い
Kotlinで書かれたサンプル。カメラアプリ用にUri
を作成し、CameraFragment
は、カメラがあなたの写真の保存から戻ってくるまでそれを保持し、予想どおりonActivityResult
であなたにそれを返します。
消費者とカメラアプリ間の仲介者として機能します。 Uri
を入力として受け取り、データ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.
}
}
}
}
Uri.fromFile(f)
の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);