昨晚在更新了公司的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结束前,要加入写权限,这样做,才,没问题...
那,是为什么要这样做...?
PHP中文网2017-04-17 18:03:40
この解決策は奇妙すぎるので、正しい解決策ではないと思います!
Android 6.0 (API レベル 23) では、将来的に権限を動的に申請する必要があります。もちろん、動的権限アプリケーションでは、クライアントがユーザーからの権限を積極的に申請する必要があります。アプリケーションが成功した場合は、その後の操作を続行し、アプリケーションが失敗した場合は、許可の適用が必要な操作を直接実行してから待機します。報告されるエラー...
github には適切にパッケージ化されたライブラリが多数あります。自分で学習することができます。
を使用することを強くお勧めします。googlesamples/easypermissions
追伸。他のライブラリには常に問題が発生します。詳細については、問題を参照してください。