Android N FileUriExposedException

Android N FileUriExposedException

伙计们我的应用程序使用库存相机拍照我使用以下代码拍照

public void takepic(View view) {

        TextView schtitle = (TextView) findViewById(R.id.Sitename);
        String schname = schtitle.getText().toString();
            String[] tokens = schname.split(" ");
            String timeStamp = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss").format(new Date());
            String imageFileName = tokens[0] + "-" + timeStamp + ".jpg";
            TextView myAwesomeTextView = (TextView)findViewById(R.id.filetext);

          //in your OnCreate() method
          myAwesomeTextView.setText(imageFileName);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    


                File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                String name = imageFileName;
                File file = new File(path, name );
                outputFileUri = Uri.fromFile(file);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
                startActivityForResult(intent, TAKE_PICTURE); 


       } 

除牛轧糖外,这在所有情况下都可以正常工作

我理解他们在 marshmallow 中所做的,您现在需要权限并且不能再使用文件 URI

我找不到任何关于如何在牛轧糖中拍照的示例代码,有人可以为我指明正确的方向,告诉我如何修改我的代码以允许这种情况发生吗?

感谢任何帮助

马克

问题是 file:// uri 不再被允许。

您必须使用 FileProvider 而不是这个。

看这里:https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en

这里引用一下,仅供参考

我们现在在 android.

的训练部分下更新了关于如何使用带有文件 uri 的相机意图来存储拍摄照片的文档。

https://developer.android.com/training/camera/photobasics.html

 public void openShare(View view) {
        // save bitmap to cache directory
        try {
            bitmap = ((BitmapDrawable) iv.getDrawable()).getBitmap();

            File cachePath = new File(getCacheDir(), "images");

            if (!cachePath.exists())
                cachePath.mkdirs();

            FileOutputStream stream = new FileOutputStream(cachePath + "/" + imageName);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
            stream.close();

            shareImage();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void shareImage() {
        File imagePath = new File(getCacheDir(), "images");
        File newFile = new File(imagePath, imageName);
        Uri contentUri = MyFileProvider.getUriForFile(this, "com.example.kushaalsingla.contentsharingdemo", newFile);

        if (contentUri != null) {
            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
            shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
            shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
            startActivity(Intent.createChooser(shareIntent, "Choose an app"));
        }
    }
################## 添加清单
       <provider
            android:name=".MyFileProvider"
            android:authorities="com.example.kushaalsingla.contentsharingdemo"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
################## filepaths.xml ########################
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images" path="images/"/>
</paths>