6

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

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

应该都是。这适用于壁纸,但对于百万像素数据,应用程序会崩溃,因为找不到裁剪活动。有人有一个工作的例子吗?官方图库应用程序确实设法找到了 camera.crop 活动......

也欢迎提供关于在哪里可以找到详细的系统意图文档的一般提示。

4

2 回答 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)));
于 2012-06-19T07:19:11.867 回答
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); 这里的路径是文件的绝对路径。

于 2018-04-16T07:40:38.833 回答