Android中如何使用代码打开各种类型的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中如何使用代码打开各种类型的文件相关的知识,希望对你有一定的参考价值。

参考技术A 在安卓中打开音乐、视频、图片、文档等文件是需要有读取SD卡权限的,如果是6.0以下的系统,则直接在清单文件中声明SD卡读取权限即可;如果是6.0或以上,则需要动态申请权限。

在7.0以下中打开文件时,通过intent调用系统安装得人软件打开文件就好了,但是在android7.0及以上的机子上这么做会报android.os.FileUriExposedException错误,

1)读取SD卡

2)动态申请权限

//设备API大于6.0时,主动申请权限(读取文件的权限)

public static  void requestPermission(Activity context)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)

        if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)

                != PackageManager.PERMISSION_GRANTED)

            ActivityCompat.requestPermissions(context, new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,

                    Manifest.permission.READ_EXTERNAL_STORAGE, 0);

       

   



3)读取文件

intent = OpenFileUtil.openFile(filePath+"/"+FileName+"."+end);

使用OpenFileUtil这个。链接: https://www.jianshu.com/p/1414101858c1

为了兼容Android7.0,获取文件Uri需要使用到FileProvider。

1)首先是AndroidManifest文件里面注册FileProvider

    android:name="android.support.v4.content.FileProvider"

    android:authorities="$applicationId.provider"

    android:exported="false"

    android:grantUriPermissions="true">

        android:name="android.support.FILE_PROVIDER_PATHS"

        android:resource="@xml/provider_paths" /> //需要自己编写xml文件

2)provider_paths.xml文件的编写

    // .表示根目录

3)打开文档方式为

intent = new Intent(Intent.ACTION_VIEW);

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

File txtFile = new File(filePath+"/"+FileName+"."+end);

Uri contentUri = FileProvider.getUriForFile(MyApplication.getContext(), BuildConfig.APPLICATION_ID+".provider", txtFile);

intent.setDataAndType(contentUri, "application/vnd.android.package-archive");

grantUriPermission(context, contentUri, intent);

startActivity(intent);

4)grantUriPermission方法添加权限

private static void grantUriPermission (Context context, Uri fileUri, Intent intent)

    List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

    for (ResolveInfo resolveInfo : resInfoList)

        String packageName = resolveInfo.activityInfo.packageName;

        context.grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

   



综合两种情况:

//判断是否是AndroidN以及更高的版本,Build.VERSION_CODES.N是Android 7.0

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)

    intent = new Intent(Intent.ACTION_VIEW);

    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    File txtFile = new File(filePath+"/"+FileName+"."+end);

    Uri contentUri = FileProvider.getUriForFile(MyApplication.getContext(), BuildConfig.APPLICATION_ID+".provider", txtFile);

    Log.i("文件地址:",contentUri.toString());

    intent.setDataAndType(contentUri, "application/vnd.android.package-archive");

    grantUriPermission(MyApplication.getContext(), contentUri, intent);

else

    //7.0以下的可以打开文件了

    intent = OpenFileUtil.openFile(filePath+"/"+FileName+"."+end);



MyApplication.getContext().startActivity(intent);

如何使用 jCIFS 在 Android 中使用默认查看器打开文件

【中文标题】如何使用 jCIFS 在 Android 中使用默认查看器打开文件【英文标题】:How to open files in Android with default viewer using jCIFS 【发布时间】:2011-12-23 06:22:10 【问题描述】:

我正在使用免费的 jCIFS 库通过 CIFS 连接到我的 NAS 设备,它运行良好。我可以毫无问题地连接并获取文件名列表等。

现在我想在默认的 Android 应用程序中打开其中一个文件 - 即应该在音乐播放器中打开音乐文件、在图库中打开图像、在视频播放器中打开视频文件等等。问题不在于获取 MIME 类型等等。问题是我不想先下载文件,它们应该被流式传输

有谁知道如何做到这一点?我知道 CifsManager (另一个第三方应用程序)能够做类似的事情,但它不使用 jCIFS 并且它需要 root 访问权限才能安装驱动器。我的应用程序不需要 root 访问权限,这一点很重要。

您可以在此处找到 jCIFS 库: http://jcifs.samba.org/

【问题讨论】:

【参考方案1】:

您可以使用 SmbFileInputStream 来读取文件。 请浏览文档jcifs.smb.SmbFileInputStream

【讨论】:

我需要在 Android 的默认查看器中启动任何选定的文件,而不是自己处理读取 - 我需要将它传递给另一个应用程序。如果我可以传递FileInputStream,那就太好了,但我不认为或不知道这是否可能。 将 InputStream 转换为 File() 并使用 Intents 打开具有 mime 类型的文件..如果您不知道 mime 类型..请参考***.com/questions/6265298/… 那行不通 - 就像我在问题中所说的那样,我不想将文件下载到设备上,它们需要流式传输。 @Michell Bak 我不确定您将如何完成流式传输文件,但我正在做的是将文件复制到设备上的公共路径(外部存储上的下载文件夹),打开该文件及其指定的应用程序,然后删除该文件。我按照 aNi 的建议做了,它对我很有用。

以上是关于Android中如何使用代码打开各种类型的文件的主要内容,如果未能解决你的问题,请参考以下文章

在Android中以ActivityResultLauncher方式进行页面跳转传递参数拍照或选择文件,以及调用系统应用打开各种类型的指定文件

安卓Android开发:以ActivityResultLauncher方式进行页面跳转传递参数拍照或选择文件,以及调用系统应用打开各种类型的指定文件

如何打开android 源代码

Android-如何通过解码和反编译apk文件来提供打开的android相机权限

Android:如何使用 OpenCV C++ 打开文件?

如何以编程方式(使用 Intent)在 Android 中打开 My Files 文件夹?