Camera Intent显示Marshmallow和Nougat中的问题

时间:2017-04-28 06:19:25

标签: android android-camera-intent

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

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

在做了一些研究之后,我得出的结论是,在点击Android N& A中的图像时文件已损坏。 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)

我哪里错了?

4 个答案:

答案 0 :(得分: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());
    }

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

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

希望它对某人有所帮助!

答案 1 :(得分:0)

检查棉花糖的许可

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();
            }

并覆盖活动的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;
       }
}

答案 2 :(得分:0)

  1. 检查API 23及以上的许可,请参阅此内容 http://www.coderzheaven.com/2016/07/29/simple-example-on-using-camera-access-permission-in-android-marshmallow/

  2. 检查你的onActivityResult()它是否以位图或uri为你提供输出。

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

答案 3 :(得分:0)

问题是Android的最新版本,因为在Android M&amp; 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>