android camera:onActivityResult()意图为空,如果它有额外的

在堆栈溢出的所有相关问题中搜索了很多并没有发现任何东西,请尽量帮助我。

我创造了一个捕捉图片的意图。 然后,我在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 ,则发生同样的情况,则意图为空,但是您将在您提供的文件( 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; } } } 

希望它有帮助

在Kotlin写的一个样本。 你创建一个Uri的相机应用程序, CameraFragment持有它,直到相机从保存你的照片返回,并将它在onActivityResult作为您所期望的给你。

CameraFragment.kt

充当消费者和相机应用程序之间的中介。 将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); 

使用以下内容:

位图bitmap = data.getExtras()。getParcelable(“data”);

有用。