java - 三星 s8 和 s9 中的 Android 外部写入权限问题
问题描述
我的应用程序中有一个下载器类,用于处理从服务器下载新的 apk 到用户 android 设备,以更新应用程序。整个模块运行良好,并授予读写权限,下载并安装 apk 没有问题。唯一的问题是 Galaxy s9 和 Galaxy s8 版本为 8.0.0,我遇到外部存储的权限被拒绝异常。我已经用多个设备和 SDK、nexus、nexus 5x、zte、sony Xperia 对其进行了测试。但它看起来只影响 Galaxy S8 和 S9。
错误
无权写入 /storage/emulated/0/Download/app-release.apk:用户 10390 和当前进程都没有 android.permission.WRITE_EXTERNAL_STORAGE。
更新活动代码
void downloadOrCancel() {
if (downloader != null && downloader.isDownloading()) {
cancel();
} else {
download();
}
// updateUi();
}
private void cancel() {
if(downloader != null)
downloader.cancel();
}
private void download() {
// Uri uri = Uri.parse(url);
downloader = Downloader.newInstance(this);
downloader.download(URL_APK);
}
private void checkPErmissions(){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
12);
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
13);
} else {
downloadOrCancel();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 12:
case 13: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
// get locations
checkPErmissions();
} else {
//Close it
finish();
}
}
break;
}
}
清单权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS" />
解决方案
我在你的代码上查找了一些东西,但对我来说一切都很好。我将其发布为答案,因为评论太长了。
我可以建议的最后一件事是因为它只发生在三星 S8 和 S9 上,也许它与从未知来源安装/下载文件的权限有关。在您的三星中转到:
Settings
--> Locked Screen and Security
-->Install unknown apps
并尝试为您的应用程序打开它。