启动意图“默默”

继续这个问题,有没有一种方法来启动一个意图,而不会提示用户的任何东西?

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

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); } 

有任何想法吗?

Solutions Collecting From Web of "启动意图“默默”"

你有不同types的意图,沉默的是广播和服务意图。 而沉默我的意思是没有什么可见的用户默认情况下(没有活动启动)。

一个意图只会问系统:有什么能够处理它? 如果有,它会通过它的东西(或在多个选项的情况下会问用户)。 之后你无法控制,除非你正在处理的是你的代码。

您的问题实际上是在Picasa中。

当用户从Picasa中select一个图像时,你会得到一个Uri。 你可以用这个Uri和ContentResolver来获取图像。 实际发生的情况是,Picasa中的ContentProvider将处理Uri,并返回图像的InputStream。

从另一个问题,我明白,你不立即得到的形象,而是保存在数据库中的Uri,并稍后处理它。

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

问题是Picasa控制着这个权限,所以如果Picasa没有提供你知道Uri的权限,那你就什么都不能做。

在我看来,这甚至不是一个错误:当用户决定时,您有权访问该映像,但您不会自动获得从Picasa访问每个映像的权限。 一种“默默地”为您提供访问每个Picasa图像的权限的服务,只要知道它的Uri,就可以让您从用户那里获取任何图像,而无需知道。 这可能不是Picasa开发者想要的。

我可以给你的最好的build议是和另外一个问题一样的:当用户select图像立即获取并保存在本地,然后使用本地Uri访问图像。

而不是试图发送一个“沉默”的意图,一个可能的解决scheme可能是使用“ 共享首选项 ”保存文件的URI – 您可以保存用户和URI作为键/值对(例如)。

当你想稍后打开文件时,可以在不发送意图的情况下打开文件。

你应该能够通过以下方式得到“真正的”uri(不会改变的):

这是为audio文件,所以使用“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)。