Android中如何使用代碼打開各種類型的文件

在安卓中打開音樂、視頻、圖片、文檔等文件是需要有讀取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這個。鏈接:http://www.lxweimin.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);

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容