5

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

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

(这是 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();
    }
}
4

7 回答 7

6

试试这个:

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

谢谢。

于 2013-01-23T17:10:59.780 回答
3

问题是图像在您的应用程序内部!因此,外部应用程序(图像查看器)无法访问应用程序内部的数据。

您可能需要做的是创建一个 Content Provider 。 http://web.archive.org/web/20111020204554/http://www.marcofaion.it/?p=7

安卓清单.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");
于 2015-08-05T06:13:13.147 回答
3

如果某个文件与您的应用关联(存储在您应用空间的内部存储中),则其他应用无法直接访问您的文件,只要提供有效的文件路径。相反,您必须创建一个文件提供程序并生成一个内容 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,所以创建它)。

file_paths.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 中指定的文件路径与 new File(context.getFilesDir(),"fileName") 匹配。getFilesDir() 将为您提供应用程序的根目录。

于 2019-10-02T16:35:16.197 回答
1
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(outputFileName)),"image/jpeg");
 startActivity(intent);
于 2013-01-23T14:07:28.933 回答
1

您可以使用扩展 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 的文件的目录指定“路径”的子元素。例如,这些 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,然后调用意图,请参阅以下链接

https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri

于 2019-05-13T09:19:12.767 回答
0

检查这个: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 文件,请尝试 Replace String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); With String ext = MimeTypeMap.getFileExtensionFromUrl(".jpg");

祝你好运。

于 2014-08-25T18:35:25.490 回答
0

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

我的问题来自下面的代码。

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

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

在此处输入图像描述

如果你看上面的Logcat,你可以发现用启动的intentcat=[android.intent.category.Launcher]会去SplashActivity. 发生这种情况是因为我创建了意图getLaunchIntentForPackage()

另一种方法是使用Intent下面setPackage()的代码

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)
于 2020-09-28T10:35:31.860 回答