开始意图"默默地"

时间:2014-12-16 11:00:19

标签: java android android-intent

关注this问题,是否有办法在不启动用户任何内容的情况下启动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);
}

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

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

您的问题实际上是Picasa。

当用户从Picasa中选择图片时,您会获得一个Uri。您可以将该Uri与ContentResolver一起使用来获取图像。 当您这样做时,实际发生的事情是来自Picasa的ContentProvider将处理Uri并为您返回图像的InputStream。

从另一个问题我明白你没有立即获得图像,而是将Uri保存在数据库中,然后再处理它。

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

问题在于Picasa可以控制该权限,因此如果Picasa没有通过了解Uri向您提供获取权限的意图,那么您无能为力。

我认为这甚至不是一个错误:当用户决定访问该图像时,您有权访问该图像,您不会自动获得从Picasa访问每个图像的权限。通过了解其Uri,“静静地”为您提供访问每个Picasa图像的权限的服务只会让您在用户不知情的情况下从用户那里获取任何图像。这可能不是Picasa开发人员想要的。

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

答案 1 :(得分:0)

可能的解决方案可能是使用“Shared Preferences”保存文件的URI,而不是尝试发送“静默”意图 - 您可以将用户和URI保存为键/值对(例如)。

如果您想稍后打开该文件,则可以在不发送意图的情况下打开该文件。

答案 2 :(得分:0)

你应该能够得到真实的" uri(一个不会改变的)以下列方式:

这是针对音频文件完成的,因此请使用" MediaStore.Images.Media.EXTERNAL_CONTENT_URI"并更改其他详细信息以符合您的情况。

Pre kit-kat:

    String songName = "";
    Cursor cursor = getContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Media.TITLE}, MediaStore.MediaColumns.DATA + " =?", new String[]{uri.toString()}, null);

    if (cursor != null && cursor.moveToNext()) {
        songName = cursor.getString(0);
    }

    if (cursor != null) {
        cursor.close();
    }
    return songName;

在Kitkat之后,由于文档提供程序而发生了更改,此代码应该可以解决问题:

Cursor cursor = null;
    String songName = "";
    try {

        String[] column = new String[]{MediaStore.Audio.Media.TITLE};
        String wholeID = DocumentsContract.getDocumentId(uri);
        // Split at colon, use second item in the array
        String id = wholeID.split(":")[1];
        // where id is equal to
        String sel = MediaStore.Images.Media._ID + " =?";
        cursor = getContext().getContentResolver().
                query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{id}, null);

        if (cursor != null && cursor.moveToNext()) {
            songName = cursor.getString(0);
        }
    }
    catch (Exception e){
        Logger.log(e);
    }
    finally {
        if (cursor != null) {
            cursor.close();
        }
    }

    return songName;

再次,更改细节以匹配您的情况并保存从您获得的光标获取的真实uri(可能在您的投影中得到此字段:MediaStore.Images.Media.DATA)。