我這網上抄了個監聽webview下載的代碼,在安卓10.0+是沒問題的,可是8.1和9.0的就不行:
webView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.allowScanningByMediaScanner();
request.setTitle("測驗");
request.setDescription("下載中..");
String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);
request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
fileName);
DownloadManager dm = (DownloadManager) getSystemService(
DOWNLOAD_SERVICE);
Toast.makeText(getApplicationContext(), "開始下載", Toast.LENGTH_LONG).show();
dm.enqueue(request);
}
});
標紅的地方是下面171的地方
報錯如下:
Process: com.example.yiznan, PID: 6840
java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/1_20200525172223237760.png: Neither user 10079 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
at android.os.Parcel.readException(Parcel.java:2004)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1539)
at android.app.DownloadManager.enqueue(DownloadManager.java:1022)
at com.example.test.MainActivity$4.onDownloadStart(MainActivity.java:171)
at xl.a(PG:519)
at afG.handleMessage(PG:25)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
這個權限是加了的 android.permission.WRITE_EXTERNAL_STORAGE
求大佬指點一二
uj5u.com熱心網友回復:
你這是沒有權限,高版本的需要動態申請。你下載的代碼可能時比較老,沒有相關代碼。動態申請權限,給你貼個例子:
private final static int mRequestCode = 10000;//權限請求碼,自行定義,主要是當系統回呼的時候會帶回,用于區分
public static void checkPermisstion(Activity activity, String[] permissions) {
Log.d(tag, "開始檢查權限:" + Build.VERSION.SDK_INT);
List<String> mPermissionList = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.d(tag, "需要動態授權");
mPermissionList.clear();
//逐個判斷你要的權限是否已經通過
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(activity, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);//添加還未授予的權限
Log.d(tag, "未授權:" + permissions[i]);
} else {
Log.d(tag, "已有權限:" + permissions[i]);
}
}
//申請權限
if (mPermissionList.size() > 0) {//有權限沒有通過,需要申請
ActivityCompat.requestPermissions(activity, permissions, mRequestCode);
}
}
}
//然后在需要得地方申請,例如activity的onStart
@Override
protected void onStart() {
super.onStart();
Log.d(tag, "主界面onStart");
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};//這里是陣列,可以同時申請多個權限
checkPermisstion(this, permissions);
}
uj5u.com熱心網友回復:
還漏了一個方法,申請權限后,系統會彈出申請權限界面,用戶操作,之后系統回呼這個方法,從這個方法里可以看到用戶是否選擇了授權
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode == mRequestCode){
boolean isNotAllPermission = false;
for (int i = 0; i < permissions.length && i < grantResults.length; i++) {
//記錄是否有權限選項用戶沒有給權限
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
isNotAllPermission = true;
break;
}
}
if (isNotAllPermission) {
Log.d(tag,"沒有獲得全部授權,會影回應用使用");
//todo
}
}
}
uj5u.com熱心網友回復:
還有,貌似你的代碼里不需要用這個權限,可以直接用系統的默認目錄,例如下載的時候僅僅是臨時保存一下,可以在下載目錄的地方呼叫這個方法獲得目錄:
/**
* 獲得下載目錄,外部存盤優先
*
* @param context 背景關系
* @return File 目錄檔案物件
*/
public static File getDownloadFolder(Context context) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
&& !Environment.isExternalStorageRemovable()) {
return context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
} else {
return context.getDir(Environment.DIRECTORY_DOWNLOADS, Context.MODE_PRIVATE);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/32222.html
標籤:Android
