在安卓中打開音樂、視頻、圖片、文檔等文件是需要有讀取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);