【问题标题】:Camera Intent shows issues in Marshmallow and Nougat相机意图显示 Marshmallow 和 Nougat 中的问题
【发布时间】:2017-04-28 06:19:24
【问题描述】:

我的示例应用在早期版本(Android M 之前)上运行良好,但在从内部存储中提取后执行压缩时崩溃,因为高度和宽度为 -1。

Bitmap bmp = BitmapFactory.decodeFile(filePath, options);    
int actualHeight = options.outHeight;
int actualWidth = options.outWidth;

经过一些研究,我得出的结论是,在 Android N 和 M 中单击图像时文件已损坏,可能是因为我不确定将图像保存为临时文件。

我用于单击图像的以下代码:

public void takePhoto() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    File f = null;
    try {
        f = setUpPhotoFile();
        mCurrentPhotoPath = f.getAbsolutePath();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(ctx.getContext(),"com.example.fileprovider", f);
        }
        else{
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        }

    } catch (IOException e) {
        e.printStackTrace();
        f = null;
        mCurrentPhotoPath = null;
    }

    ctx.startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}

fileprovider.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="images" path="Pictures/AIADMK/"/>
</paths>

manifest.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/fileprovider" />
</provider>

以下是崩溃错误:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/AIADMK/IMG_20170428_122804_1986080142.jpg
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
    at helper.ImageHelper.takePhoto(ImageHelper.java:108)
    at helper.ImageHelper$1.onClick(ImageHelper.java:73)
    at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1134)
    at android.widget.AdapterView.performItemClick(AdapterView.java:315)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1193)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3231)
    at android.widget.AbsListView$3.run(AbsListView.java:4207)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:5769)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

我哪里错了?

【问题讨论】:

  • 发布您的崩溃日志
  • 张贴@Raghunandan
  • 好的,对于较低版本的上述代码@Raghunandan
  • 我认为在创建临时位图时出现问题,因此问题可能出在 setUpPhotoFile();在这种方法中,请先发布此内容和完整的崩溃日志,然后我们可以提供帮助
  • 当我将点击的图像保存在内部存储中时,例如 InternalStorage/Pictures/MySample/img200000.jpg 那么如何在 res 文件夹下的 fileprovide.xml 文件中指定名称和路径一个应用程序。@Raghunandan

标签: android android-camera-intent


【解决方案1】:

在向相机请求之前添加所需的权限检查 还有

对于 Android N, 将此代码添加到 Application 类的 onCreate() 方法中。

   if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
    }

无需为此指定提供者或路径。

注意-使用提供程序仍然是完成相同任务的最佳方式。

希望对某人有所帮助!

【讨论】:

    【解决方案2】:

    检查棉花糖的权限

    if (Build.VERSION.SDK_INT >= 23 &&
                        (ContextCompat.checkSelfPermission(yourActivityContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {
                    ActivityCompat.requestPermissions(yourActivityContext, new String[]{Manifest.permission.CAMERA}, 2//requestCode);
                } else {
                    selectImage();
                }
    

    并覆盖Activity的onRequestPermissionsResult

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
          case 2: //same request code you provided in code above
    
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                       selectImage();
    
                    }
    
    
                break;
           }
    }
    

    【讨论】:

    • 我已授予“M 的运行时权限”
    【解决方案3】:
    1. 检查 API 23 及更高版本的权限,请参阅此 http://www.coderzheaven.com/2016/07/29/simple-example-on-using-camera-access-permission-in-android-marshmallow/

    2. 检查您的 onActivityResult() 是否以位图或 uri 形式提供输出。

    3.如果你在 uri 中获得输出,请将其转换为位图。

    【讨论】:

      【解决方案4】:

      问题是最新版本的 Android,因为在 Android M & N 中,我们必须使用 FileProvider 来保存文件,而对于早期版本,我们可以使用 Uri.fromFile(f)。 我必须更改我的 fileprovider.xml,如下所示:

      <?xml version="1.0" encoding="utf-8"?>
      <paths xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">
          <external-path name="myexternalimages" path="Pictures/AIADMK" />
      </paths>
      

      【讨论】:

        猜你喜欢
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多