在Android';中使用URI打开图像;s默认画廊图像查看器

在Android';中使用URI打开图像;s默认画廊图像查看器,android,android-image,Android,Android Image,我已经提取了图像uri,现在我想用Android的默认图像查看器打开图像。甚至更好的是,用户可以选择使用什么程序打开图像。如果您试图打开一个文件,文件探索者会为您提供类似的服务。问问自己,也回答自己: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */ 它还将询问使用什么程序查看

我已经提取了图像uri,现在我想用Android的默认图像查看器打开图像。甚至更好的是,用户可以选择使用什么程序打开图像。如果您试图打开一个文件,文件探索者会为您提供类似的服务。

问问自己,也回答自己:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */

它还将询问使用什么程序查看文件。

接受的答案对我不起作用

工作内容:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*");
startActivity(intent);
尝试使用它:

Uri uri =  Uri.fromFile(entry);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String mime = "*/*";
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
if (mimeTypeMap.hasExtension(
    mimeTypeMap.getFileExtensionFromUrl(uri.toString())))
    mime = mimeTypeMap.getMimeTypeFromExtension(
        mimeTypeMap.getFileExtensionFromUrl(uri.toString()));
intent.setDataAndType(uri,mime);
startActivity(intent);

对于这个问题,一个更干净、更安全的答案(您真的不应该硬编码字符串):

您所要做的就是将图像id附加到对象的路径末尾。然后使用视图操作和Uri启动一个意图


图像id来自查询内容解析程序。

我使用它,它适合我

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);
基于但稍作修改:Uri由参数接收:

private void showPhoto(Uri photoUri){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(photoUri, "image/*");
    startActivity(intent);
}

几乎没有机会使用照片或图库应用程序(可能存在),但您可以尝试内容查看器


请查看类似问题的另一个答案

以上所有答案均未打开图片。。当我第二次尝试打开它时,会显示图库而不是图像

我从各种答案的混合中得到了答案

Intent galleryIntent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setDataAndType(Uri.fromFile(mImsgeFileName), "image/*");
galleryIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(galleryIntent);

这个方法只对我有效。

如果你的应用程序针对安卓N(7.0)及以上版本,你不应该使用上面的答案(“Uri.fromFile”方法),因为它对你不起作用

相反,您应该使用ContentProvider

例如,如果您的图像文件位于外部文件夹中,则可以使用以下内容(类似于我编写的代码):

清单:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

res/xml/provider_path.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--<external-path name="external_files" path="."/>-->
    <external-path
        name="files_root"
        path="Android/data/${applicationId}"/>
    <external-path
        name="external_storage_root"
        path="."/>
</paths>


如果您的图像位于应用程序的私有路径中,您应该创建自己的ContentProvider,就像我在链接上创建的“OpenFileProvider”一样。

如果您使用android N及以下版本,这可能会有所帮助

 File file=new File(Environment.getExternalStorageDirectory()+"/directoryname/"+filename);
        Uri path= FileProvider.getUriForFile(MainActivity.this,BuildConfig.APPLICATION_ID + ".provider",file);

        Intent intent=new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(path,"image/*");
        intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory

使用
Intent.ACTION\u VIEW
显示文件的问题在于,如果传递
Uri
解析路径。并非在所有情况下都有效。要解决该问题,您需要使用:

Uri.fromFile(new File(filePath));
而不是:

Uri.parse(filePath);

编辑

这是我的完整代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(mediaFile.filePath)), mediaFile.getExtension());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

信息

MediaFile
是我的域类,用于将数据库中的文件包装到对象中。
MediaFile.getExtension()
返回文件扩展名为
Mimetype
字符串。示例:
“image/png”


传统代码:需要显示任何文件(扩展名)

如果需要更多代码,请告诉我。

我的解决方案

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/your_app_folder/"+"your_picture_saved_name"+".png")), "image/*");
context.startActivity(intent);

我使用文件提供程序的解决方案

    private void viewGallery(File file) {

 Uri mImageCaptureUri = FileProvider.getUriForFile(
  mContext,
  mContext.getApplicationContext()
  .getPackageName() + ".provider", file);

 Intent view = new Intent();
 view.setAction(Intent.ACTION_VIEW);
 view.setData(mImageCaptureUri);
 List < ResolveInfo > resInfoList =
  mContext.getPackageManager()
  .queryIntentActivities(view, PackageManager.MATCH_DEFAULT_ONLY);
 for (ResolveInfo resolveInfo: resInfoList) {
  String packageName = resolveInfo.activityInfo.packageName;
  mContext.grantUriPermission(packageName, mImageCaptureUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
 }
 view.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_VIEW);
 intent.setDataAndType(mImageCaptureUri, "image/*");
 mContext.startActivity(intent);
}
private void视图库(文件){
Uri mImageCaptureUri=FileProvider.getUriForFile(
McContext,
mContext.getApplicationContext()
.getPackageName()+“.provider”,文件);
意向视图=新意向();
视图.setAction(意图.ACTION\u视图);
view.setData(mImageCaptureUri);
列表resinfo列表=
mContext.getPackageManager()
.QueryInputActivities(查看,PackageManager.MATCH_仅默认值_);
对于(ResolveInfo ResolveInfo:ResInfo列表){
字符串packageName=resolveInfo.activityInfo.packageName;

mContext.grantUriPermission(packageName、mImageCaptureUri、Intent.FLAG_GRANT_URI_WRITE_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } view.addFlags(Intent.FLAG\u GRANT\u WRITE\u URI\u权限); 意图=新意图(); intent.setAction(intent.ACTION\u视图); intent.setDataAndType(mImageCaptureUri,“image/*”); mContext.startActivity(意图); }
uri必须是内容uri而不是文件uri, 您可以通过FileProvider获取contentUri,如下所示

Uri contentUri = FileProvider.getUriForFile(getContext(),"com.github.myApp",curFile);
不要忘记在清单文件中添加提供程序

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.github.myApp"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
</provider>


Hi hari,您的代码对打开图像很有用。你能找到一个打开gallery文件夹的解决方案吗。这是我的问题@djk我只是在这里回答这个问题,看看它是否与你的问题有关。以防其他人和我一样被困在同一个问题上-我添加了intent.setType(“image/png”)(我知道该图像将是一个png文件),它阻止了图库打开该图像!因此,setType在这里起反作用:)此外,您可以使用
intent.setDataAndType(uri,“image/*”)
强制Android使用图像查看应用程序。这种方法可以用来避免仅仅为了查看图像而创建新布局吗?是的,但是你如何在Android 2.2和2.3上避免在gallery说它搜索新的fotos和相册时出现10秒的黑屏等待?@max4ever:找到解决问题的方法了吗?是的,
File f=new File(…,…);if(f.isFile()){MediaScannerConnection.scanFile(SchedaActivity.this,新字符串[]{f.toString()},null,新MediaScannerConnection.OnScanCompletedListener(){@Override public void onScanCompleted(字符串路径,Uri){Intent Intent=new Intent(Intent.ACTION_VIEW);Intent.setDataAndType(uri,“image/*”);SchedaActivity.this.startActivityForResult(Intent,SchedaActivity.this.ACTIVITY_CODE);}}};Android 4.1将在您仅指定“image/*”时显示图像。这在Android 2.3上不起作用。您必须指定mime类型:“image/jpeg”。此答案以
file:///sdcard...
-这是故意的吗?这仅显示单个选定图像,而不显示同一文件夹中的其他图像(以便用户可以向左/向右滑动以查看其他图像).你知道如何实现吗?@Atul在这种情况下,用例完全不同。OP希望使用其URI显示X图像。似乎你想在确定的位置打开图库,或b)在图库中打开一组您具有URI的照片。在web上进行一些研究或提出一个新问题,因为您的用例完全不同。感谢您的快速回复。我需要实现OP所要求的相同功能。您(和Vikas)的回答achi
    private void viewGallery(File file) {

 Uri mImageCaptureUri = FileProvider.getUriForFile(
  mContext,
  mContext.getApplicationContext()
  .getPackageName() + ".provider", file);

 Intent view = new Intent();
 view.setAction(Intent.ACTION_VIEW);
 view.setData(mImageCaptureUri);
 List < ResolveInfo > resInfoList =
  mContext.getPackageManager()
  .queryIntentActivities(view, PackageManager.MATCH_DEFAULT_ONLY);
 for (ResolveInfo resolveInfo: resInfoList) {
  String packageName = resolveInfo.activityInfo.packageName;
  mContext.grantUriPermission(packageName, mImageCaptureUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
 }
 view.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_VIEW);
 intent.setDataAndType(mImageCaptureUri, "image/*");
 mContext.startActivity(intent);
}
Uri contentUri = FileProvider.getUriForFile(getContext(),"com.github.myApp",curFile);
<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.github.myApp"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
</provider>