android 从内部存储器打开有意图的图像

ut6juiuv  于 2023-03-06  发布在  Android
关注(0)|答案(8)|浏览(121)

我想打开一个图像从内部文件夹与android默认的图像查看器,在Nexus 7平板电脑上。我使用以下代码,但由于某种原因,图像没有显示。我做错了什么?文件的路径是:

file:///data/data/com.example.denandroidapp/files/Attachments/photoTemp/photo.jpg

(this是Uri.parse(“file://”+ file)返回的内容)。

ArticlePhoto photo =  new ArticlePhoto(soapObject);
File f = new File(context.getFilesDir() + "/Attachments/photoTemp");

if(!f.exists())
    f.mkdirs();

if (photo.ArtPhoto != null) {
    Bitmap articlePhoto = BitmapFactory.decodeByteArray(photo.ArtPhoto, 0, photo.ArtPhoto.length);                      
    ByteArrayOutputStream  bytesFile  =  new ByteArrayOutputStream();
    articlePhoto.compress(Bitmap.CompressFormat.JPEG, 100, bytesFile);

    File file = new File(f + "/photo.jpeg");

    try {
        if(!file.exists())
            file.createNewFile();

        FileOutputStream outStream =  new FileOutputStream(file);

        outStream.write(bytesFile.toByteArray());                  
        outStream.close();

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse("file://" + file),"image/jpeg"); 
        startActivity(intent);

    } catch(Exception ex) {
        AlertDialog alert =  new  AlertDialog.Builder(context).create();
        alert.setTitle("Warning!");
        alert.setMessage(ex.getMessage());
        alert.show();
    }
}
x33g5p2x

x33g5p2x1#

试试这个:

Intent intent = new Intent();  
    intent.setAction(android.content.Intent.ACTION_VIEW);
    Uri uri = Uri.parse("file://" + file.getAbsolutePath());                 
    intent.setDataAndType(uri,"image/*");
    startActivity(intent);

谢谢。

aor9mmx1

aor9mmx12#

问题是图像是应用程序内部的!因此外部应用程序(图像查看器)无法访问应用程序内部的数据。
您可能需要创建一个内容提供程序。http://web.archive.org/web/20111020204554/http://www.marcofaion.it/?p=7

Android清单.xml

<provider android:authorities="com.example.denandroidapp" android:enabled="true" android:exported="true" android:name=<fully classified name of provider class>>
</provider>

创建意图

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);

Uri uri = Uri.parse("content://com.example.denandroidapp/" + filename);
intent.setDataAndType(uri, "image/jpeg");
ycggw6v2

ycggw6v23#

如果某个文件与你的应用关联(存储在你的应用空间的内部存储上),则其他应用无法直接访问提供了有效文件路径的文件。相反,你必须创建文件提供程序并生成内容URI。
首先,在AndroidManifest.xml中添加文件提供程序

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.mydomain.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>

然后您需要在xml/file_paths. xml中创建一个名为file_paths的文件(默认情况下不创建目录xml,因此创建它)。
文件_路径. xml如下所示

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="myFiles" path="./"/>
</paths>

添加尽可能多的路径,您希望您的提供程序访问。
最后你需要创建你的意图

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
File imagePath = new File(context.getFilesDir(), "fileName");
Uri contentUri = FileProvider.getUriForFile(context, "com.mydomain.fileprovider", imagePath);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(contentUri,"image/*");
context.startActivity(intent);

注:确保file_paths. xml中指定的文件路径与新文件(context.getFilesDir(),“fileName”)匹配。getFilesDir()将为您提供应用的根目录。

a8jjtwal

a8jjtwal4#

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(outputFileName)),"image/jpeg");
 startActivity(intent);
utugiqy6

utugiqy65#

您可以使用扩展ContentProvider的FileProvider
检查链接-
https://developer.android.com/reference/android/support/v4/content/FileProvider
要指定FileProvider组件本身,请向应用清单添加“provider”元素。

<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />
</provider>

对于包含要为其设置内容URI的文件的每个目录,必须指定“paths”的子元素。例如,以下XML元素指定两个目录

<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <files-path name="my_images" path="images/"/>
  <files-path name="my_docs" path="docs/"/>
</paths>

之后,您需要为文件生成内容URI,然后调用Intent,请参阅以下链接
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri

mtb9vblg

mtb9vblg6#

检查这个:https://stackoverflow.com/a/11088980/1038442;

File file = new File(filePath);
MimeTypeMap map = MimeTypeMap.getSingleton();
String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName());
String type = map.getMimeTypeFromExtension(ext);
if (type == null)
    type = "*/*";

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.fromFile(file);
intent.setDataAndType(data, type);
startActivity(intent);

PS:如果你试图打开. jpg文件,尝试替换字符串扩展名= MimeTypeMap. getFileExtensionFromUrl(文件. getName());* * 与**字符串扩展名= MimeTypeMap. getFileExtensionFromUrl(". jpg");
祝你好运。

esyap4oy

esyap4oy7#

在我的例子中,画廊启动,但没有显示任何图像,并直接进入主页。我的情况是非常不同的OP所面临的,但我认为值得一提,因为这里的问题是关于图像没有显示通过隐含的意图。
我的问题来自下面的代码。

val intent = context.packageManager.getLaunchIntentForPackage(packageName ?: "")

上面的代码告诉PackageManager启动应用程序的入口点,而不是显示图像的Activity。

如果查看上面的Logcat,您会发现使用cat=[android.intent.category.Launcher]启动的Intent将转到SplashActivity。这是因为我使用getLaunchIntentForPackage()创建了Intent
另一种方法是将IntentsetPackage()一起使用,如下面中的代码所示

val intent = Intent()
val uri = Uri.fromFile(file) // You should probably replace with ContentProvider's uri
intent.apply {
    flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
    action = Intent.ACTION_VIEW
    setPackage(packageName)
    setDataAndType(uri, "image/*")
}
context.startActivity(intent)
qlfbtfca

qlfbtfca8#

代码行的小改动对我很有效。

val intent = Intent(Intent.ACTION_VIEW)
val contentUri = FileProvider.getUriForFile(mContext, mContext.packageName + ".provider", mediaFile)
intent.setDataAndType(contentUri, mimeType)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK // <-- should be before 'addFlags'
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)  // <--- this line
mContext.startActivity(intent)

下面的代码不起作用。

val intent = Intent(Intent.ACTION_VIEW)
 val contentUri = FileProvider.getUriForFile(mContext, mContext.packageName + ".provider", mediaFile)
 intent.setDataAndType(contentUri, mimeType) 
 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) 
 intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK 
             
 mContext.startActivity(intent)

相关问题