android:尝试设置Wallpaper时外部应用程序崩溃

时间:2018-02-04 18:44:46

标签: android

我正在尝试创建一个应用程序,然后让用户将图像设置为墙纸。我正在通过毕加索将图像保存到内部存储中。文件正在保存,我正在创建file:// URI以便与其他应用程序共享(图库应用程序将其设置为墙纸)。但问题是当我选择我想通过崩溃设置壁纸的应用程序。 (在建成的画廊和whatsapp也)。我试图记录图像文件路径并创建file:// URI路径,它们看起来不同,这是正常的我认为。但是为什么共享图片的其他应用程序崩溃了,虽然图像被保存到SD卡中。我的应用程序中的图像是否可以访问其他应用程序?如果没有做什么让他们可以访问?

下面是我的代码,我将其设置为壁纸,下面是文件图像路径和URI路径的日志。

public void setWallpaper(){

        if(imageFile !=null){
            Log.d("FILE",imageFile);
            File file=new File(imageFile);
            Uri apkURI = FileProvider.getUriForFile(
                    WallpaperDetailActivity.this,
                    BuildConfig.APPLICATION_ID + ".provider", file);

            Log.d("ANURAN",apkURI.getPath()+"");
            Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setDataAndType(apkURI, "image/jpeg");
            intent.putExtra("mimeType", "image/jpeg");
            startActivityForResult(Intent.createChooser(intent,"Set As: "),100);
        }

    }

//日志

02-05 00:00:07.306 2303-3242/com.mranuran.animewallpapershd I/image: image saved to >>>/storage/emulated/0/AnimeWallpapersHD/758665.jpg
    02-05 00:00:13.476 2303-2303/com.mranuran.animewallpapershd D/FILE: /storage/emulated/0/AnimeWallpapersHD/758665.jpg
    02-05 00:00:13.478 2303-2303/com.mranuran.animewallpapershd D/ANURAN: /external_files/AnimeWallpapersHD/758665.jpg

2 个答案:

答案 0 :(得分:1)

在Android Doc中进行了一些彻底的阅读之后,即使提供了文件URI,我也不得不在意图中添加一个标志,以使其可供其他应用程序读取。 所以我只需要一行,现在工作正常。

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

答案 1 :(得分:0)

尝试在setDataAndType意图方法中使用Uri.fromFile(file)的一般Uri。

所以最终的代码将是,

public void setWallpaper(){

    if(imageFile !=null){
        Log.d("FILE",imageFile);
        File file =new File(imageFile);

        Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.setDataAndType(Uri.fromFile(file), "image/jpeg");
        intent.putExtra("mimeType", "image/jpeg");
        startActivityForResult(Intent.createChooser(intent,"Set As: "),100);
    }

}