“默默地”开始意图

2022-09-03 03:06:12

着这个问题,有没有办法在不提示用户的情况下在Android中开始一个意图?

现在,我正在像这样检索图像:

public void changeImage(View view) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(
        Intent.createChooser(intent, getResources().getString(R.string.select_picture)),
        PICK_IMAGE);
}

然后我存储Uri,并在必要时显示图像(我实际上首先调整它的大小,但这并不重要):

Uri _uri = Uri.parse(_path);
InputStream imageStream = null;
try {
    imageStream = getContentResolver().openInputStream(_uri);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
Bitmap b = BitmapFactory.decodeStream(imageStream);
iv.setImageBitmap(b);

我想通过“静默”调用意图来检索给定其Uri的图像数据,以便获得相关许可。所以我需要这样的东西:

编辑:

我尝试了该方法。此代码具有以下行为:setPackage()

  • 如果使用ACTION_VIEW意图,则库将打开并显示特定图像。

  • 如果使用ACTION_GET_CONTENT意图,系统会提示我从库中选取图像,即使我提供了特定的 Uri。

>

Uri _uri = Uri.parse(_path);
InputStream imageStream = null;
Bitmap b = null;
try {
    imageStream = getContentResolver().openInputStream(_uri);
    b = BitmapFactory.decodeStream(imageStream);
    ImageView iv = (ImageView) findViewById(R.id.playerImage);
    iv.setImageBitmap(b);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (SecurityException e) {
    e.printStackTrace();

    Intent dummyIntent = new Intent(Intent.ACTION_GET_CONTENT);
    //Intent dummyIntent = new Intent(Intent.ACTION_VIEW);
    dummyIntent.setDataAndType(_uri,"image/*");
    dummyIntent.setPackage("com.google.android.gallery3d");

    startActivityForResult(dummyIntent, PICK_IMAGE);
}

有什么想法吗?


答案 1

你有不同类型的意向,沉默的意向是广播和服务意向。通过沉默,我的意思是默认情况下,用户没有任何可见的事情发生(没有活动启动)。

意图只会问系统:是否有东西能够处理它?如果有,它会将其传递给那个东西(或者在多个选项的情况下会询问用户)。在那之后,你无法控制,除非处理它的是你的代码。

您的问题实际上与 Picasa 有关。

当用户从 Picasa 中选择图片时,您将获得一个 Uri。您可以将该 Uri 与 ContentResolver 结合使用来获取图像。当您这样做时,实际发生的情况是,Picasa 的内容提供者将处理 Uri 并返回图像的输入流。

从另一个问题中,我了解到您不会立即获得图像,而是将Uri保存在数据库中,然后对其进行处理。

由于 Picasa 使用权限机制为您提供图片,并且由于当您尝试使用 Uri 时,该权限已过期,因此您希望再次从 Picasa 获得 Uri(以及权限),而无需再次询问用户。

问题在于,Picasa 控制着该权限,因此,如果 Picasa 不向您提供通过了解 Uri 而获得该权限的意图,则您无能为力。

在我看来,这甚至不是一个错误:当用户决定时,您有权访问该图片,因此,您不会自动获得从 Picasa 访问每张图片的权限。一项“静默”为您提供访问每张 Picasa 图片的权限的服务,只需知道其 Uri,您就可以在用户不知情的情况下从用户那里获得任何图片。这可能不是 Picasa 开发者想要的。

我能给你的最好的建议与你在另一个问题中得到的建议相同:当用户选择图像时,立即获取它并保存在本地,然后使用本地Uri访问图像。


答案 2

与其尝试发送“静默”意图,一种可能的解决方案可能是使用“共享首选项”保存文件的URI - 您可以将用户和URI保存为键/值对(例如)。

当您以后想要打开该文件时,可以在不发送意向的情况下打开它。


推荐