【问题标题】:android:External apps crash when trying to set Wallpaperandroid:尝试设置墙纸时外部应用程序崩溃
【发布时间】:2018-02-05 03:09:54
【问题描述】:

我正在尝试制作一个应用程序,让用户将图像设置为墙纸。我正在通过 picasso 下载图像并将其保存到内部存储中。文件正在保存,我正在创建 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

【问题讨论】:

    标签: android


    【解决方案1】:

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

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    

    【讨论】:

      【解决方案2】:

      尝试在 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);
          }
      
      }
      

      【讨论】:

      • 通用 URI 不起作用,我只是从那个开始的。你必须使用 file://(内容)URI。
      • 奇怪,我只是在我的设备上快速尝试确认它是否有效。
      • 可能是您的目标 SDK 较低。我的目标是 23 岁以上
      • 不,我的目标是 8.0。这些是我的 gradle 配置 - compileSdkVersion 26 minSdkVersion 16 targetSdkVersion 26 .
      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多