如何使用Intent.ATTACH_DATA

6

我正在尝试为图像实现“设置为”功能。我正在使用Intent.ATTACH_DATA,这样用户至少可以选择联系人照片和壁纸。我应该传递的额外参数让我感到困惑。如果我正确阅读文档,

Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
    intent.setType("image/*");
intent.setData(mImageCaptureUri);
        startActivity(Intent.createChooser(intent, "hey"));

应该是这样的。对于墙纸,它是有效的,但使用百万像素数据时,应用程序会崩溃,因为找不到任何裁剪活动。有人有可行的例子吗?官方图库应用程序确实能够找到相机裁剪活动...
欢迎提供有关详细系统意图文档的提示。
2个回答

14

在经过漫长而曲折的android源码之路后,我在默认相册(gallery3d)应用程序中找到了实际代码。我将其改编为我的应用程序所使用,并为方便在其他应用程序中导入时重新编写了它。如果您使用或赞赏此内容,请点赞本答案。

来源:从grepcode上的gallery3d源代码改编而来

用法:将第一行更改为匹配您的照片的完整路径(以/mnt/开头)。将字符串“set_as”添加到strings.xml作为操作选择器标题。

String absolutepath = MyApplication.appRootDir + relpath;//change for your application
    Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
    MimeTypeMap map = MimeTypeMap.getSingleton();
    String ext = absolutepath.substring(absolutepath.lastIndexOf('.') + 1);
    String mimeType = map.getMimeTypeFromExtension(ext);
    Uri uri = Uri.fromFile(new File(absolutepath));
    intent.setDataAndType(uri, mimeType);
    intent.putExtra("mimeType", mimeType);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Activity activity = (Activity) this;
    activity.startActivity(Intent.createChooser(
            intent, activity.getString(R.string.set_as)));

我认为这个方法可行,而其他 Stack Overflow 上的答案则不行,是因为它在 URI 之前添加了 file://。 - user11230

2
上面的回答都很好,但是这里有一个我测试并使用过的方法。
  private void setAsWallpaper(String path_of_file) {    
    try {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_ATTACH_DATA);
        File file = new File(path_of_file);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        intent.setDataAndType(FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file), getMimeType(path_of_file);
        context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(context, "Exception generated", Toast.LENGTH_SHORT).show();
    }
}


 private static String getMimeType(String url) {
    String type = null;
    String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    if (extension != null) {
        type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    }
    return type;
}

只需调用 setAsWallpaper(path) 方法,其中 path 是文件的绝对路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接