昨晚在更新了公司的app,接着推送出去了,发现有人反馈说自动更新用不了。我调试了一下,定位到代码和报错信息如下:
代码:
try {
//创建下载任务,downloadUrl就是下载链接
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("xxxx下载链接"))
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOCUMENTS, "Honey_.apk")
.setTitle("下载标题")
.setMimeType("")
.setVisibleInDownloadsUi(true)
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setDescription("下载的具体描述");
//获取下载管理器
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
//将下载任务加入下载队列,否则不会进行下载
long TaskID = downloadManager.enqueue(request);
LogUtils.e(OpenLog,TAG,"TaskId:"+TaskID);
} catch (Exception e) {
LogUtils.e(OpenLog,TAG,"Exception2:"+e.getMessage());
}
在long TaskID = downloadManager.enqueue(request);
这里,抛出异常了:
E/MainActivity: Exception2:need WRITE_EXTERNAL_STORAGE permission to use DESTINATION_FILE_URI: uid 10207 does not have android.permission.WRITE_EXTERNAL_STORAGE.
报错信息是,我没有声明权限?查了一下,我是有声明的:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="testmodules">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".chestnut.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/app_ico"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".chestnut.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".chestnut.Main2Activity" />
<activity android:name=".chestnut.DialogActivity"
android:theme="@style/DialogTransparent" />
</application>
</manifest>
之前一直是这样声明的,也没有报错什么的,
然后,Google,百度一下,发现,要写成如下的:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="testmodules">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".chestnut.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/app_ico"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".chestnut.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
额,Application开始前,Manifest开始后,要加入写权限,Application结束后,Manifest结束前,要加入写权限,这样做,才,没问题...
那,是为什么要这样做...?
Android 6.0(API LEVEL 23)에서는 향후 권한을 동적으로 적용해야 합니다. 물론 AndroidManifest.xml에도 권한을 선언해야 합니다. 동적 권한을 적용하려면 클라이언트가 사용자에게 적극적으로 권한을 신청해야 합니다. 작업을 수행하기 전에 대화 상자 형태로 응용 프로그램이 실패하면(또는 전혀 적용되지 않을 경우) 바로 후속 작업을 수행하고 권한 응용 프로그램이 필요한 작업을 기다립니다. 보고할 오류...
github에는 잘 패키지된 라이브러리가 많이 있으므로 직접 알아볼 수 있습니다. 다음을 사용하는 것이 좋습니다.
googlesamples/easypermissions
p.s. 다른 라이브러리에는 항상 문제가 있습니다. 자세한 내용은 이슈를 참조하세요.