Android - 使用“设置壁纸”意图设置壁纸

11
问题是在 这里这里 提出的,但没有真正的答案。
Android内置了“设置壁纸”功能,此功能可在启动mime为“image/jpeg”的activity意图时使用,或在浏览器中长按图像时使用。
我的问题是:如何使用文件Uri编程方式调用内置的“设置壁纸”功能?
4个回答

22

看起来这个问题没有答案,但是我找到了一个解决方法:

    Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.setDataAndType(uri, "image/jpeg");
    intent.putExtra("mimeType", "image/jpeg");
    this.startActivity(Intent.createChooser(intent, "Set as:"));

我遇到了错误:无法加载照片。我正在使用drawable并获取其Uri:Uri uri = Uri.parse(context.getResources().getDrawable(drawable).toString()); - Neha Agarwal
@NehaAgarwal 尝试使用 Uri uri = Uri.parse("android.resource://your.package.here/drawable/image_name") - Shrey Garg
在 Pixel Android 10 上,它显示“没有应用程序可以执行此操作” - thecr0w

8

只有我能工作:

Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setDataAndType(uri, "image/*");
intent.putExtra("mimeType", "image/*");
this.startActivity(Intent.createChooser(intent, "Set as:"));

如果MIME类型为"image/jpeg",但应用程序找不到图像。

4
如果在选择应用程序设置壁纸之后,您的应用程序崩溃了,您需要添加以下内容:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

一个典型的例子是电子邮件应用中的附件。访问电子邮件时应该受到权限保护,因为这是敏感的用户数据。然而,如果将一个图像附件的URI给予图像查看器,那么图像查看器就不再具有打开附件的权限,因为它没有理由持有访问所有电子邮件的权限。
此问题的解决方案是per-URI权限:当启动活动或向活动返回结果时,调用者可以设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION。这授予接收活动访问意图中特定数据URI的权限,无论它是否具有访问与意图相对应的内容提供程序中的数据的任何权限。 https://developer.android.com/guide/topics/permissions/overview
val intent = Intent(Intent.ACTION_ATTACH_DATA)
        .apply {
            addCategory(Intent.CATEGORY_DEFAULT)
            setDataAndType(uri, "image/*")
            putExtra("mimeType", "image/*")
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }
    startActivity(Intent.createChooser(intent, "Set as:"))

0

对我来说只有工作

 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_ATTACH_DATA);
 intent.addCategory(Intent.CATEGORY_DEFAULT);
 intent.setDataAndType(ContactsContract.Contacts.CONTENT_URI, "image/*");
 intent.putExtra("mimeType", "image/*");
 startActivityForResult(Intent.createChooser(intent, "Select service:"), position);

position - 它是你的:getIntent().getExtras().getInt("id_test");


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