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”);
有用。
- Kotlin webview崩溃
- 如何在内存中运行编译kotlin文件的测试并检查结果?
- 架构组件:ViewModelProvider如何知道调用哪个构造函数?
- Dagger 2命名不能没有@Provides方法提供
- 使用另一个文件Kotlin的变量
- Kotlin,Java,multidex,Dagger 2,Butterknife和Realm:transformClassesWithMargingForDebug:重复条目:org / jetbrains / annotations / NotNull.class
- 服务器套接字侦听客户端与轮询服务的Android即时通讯应用程序
- Kotlin:ProGuard擦除属性属性
- 使用改造方法更具表现力的方式