相机意图的结果代码为0

3

代码:

  Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);                                   
        try{
               imageUri = Uri.fromFile(File.createTempFile("image", ".jpg"));
           }catch (Exception ex){
               ex.printStackTrace();
          }

   intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent, REQUEST_CAMERA);

我在Android Manifest文件中使用了与此相关的所有权限... 以上意图在Moto G3 Turbo和许多其他设备上都可以正常工作,但是只有在Nexus 5的情况下,resultCode才为0..为什么?


2
File.createTempFile() 不要求返回一个全局可写的文件路径。我预计这段代码在许多设备上都会失败。 - CommonsWare
2
这个示例应用程序使用外部存储上的文件。然而,随着Android N开始禁止file: Uri值,这种技术将会开始失效。这个示例应用程序与第一个示例相同,但是使用了FileProvider,允许第三方相机应用程序直接将图像保存到我的应用程序的内部存储中。请参考此处获取更多信息。 - CommonsWare
“仍然使用Uri来满足我的需求”,但您的targetSdkVersion不能高于23。 - CommonsWare
@CommonsWare...这就是我使用它的原因,我的targetSDKVersion实际上是22... :) - Saurabh Vardani
1个回答

6
在CommonsWare先生的指导下,我通过进行以下更改解决了我的问题...
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
destination = Environment.getExternalStorageDirectory().getPath() + "/image.jpg";
outputUri= Uri.fromFile(new File(destination));
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
  intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
  List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
  for (ResolveInfo resolveInfo : resInfoList) {
      String packageName = resolveInfo.activityInfo.packageName;
      grantUriPermission(packageName, outputUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
  }
}         

startActivityForResult(intent, REQUEST_CAMERA); 

1
@Hey Saurabh,我正在使用你的解决方案,但在 Nexus(6.0.1)上仍然得到结果代码0,但在 Moto Power E3(版本6.0)上可以工作。 - user2028
有没有解决方案?我正在使用 Nexus 6P,尝试了这段代码,但仍然遇到同样的问题。 - Noorul
1
很可能是因为Environment#getExternalStorageDirectory已经被弃用,而且我相当确定它与没有外部SD卡(或类似设备)的设备不兼容。 - Jensen Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接