Java 三星s8和s9中的Android外部写入权限问题

Java 三星s8和s9中的Android外部写入权限问题,java,android,sdk,android-permissions,Java,Android,Sdk,Android Permissions,我的应用程序中有一个downloader类,负责将新的apk从服务器下载到用户android设备中,以更新应用程序。 整个模块工作良好,授予读写权限,下载并安装apk,没有问题。唯一的问题是Galaxy s9和Galaxy s8版本为8.0.0,我遇到了外部存储的权限拒绝异常。 我已经用多种设备和SDK、nexus、nexus 5x、中兴通讯、索尼Xperia对其进行了测试。但它看起来只影响星系S8和S9 错误 没有写入/storage/emulated/0/Download/app-relea

我的应用程序中有一个downloader类,负责将新的apk从服务器下载到用户android设备中,以更新应用程序。 整个模块工作良好,授予读写权限,下载并安装apk,没有问题。唯一的问题是Galaxy s9和Galaxy s8版本为8.0.0,我遇到了外部存储的权限拒绝异常。 我已经用多种设备和SDK、nexus、nexus 5x、中兴通讯、索尼Xperia对其进行了测试。但它看起来只影响星系S8和S9

错误 没有写入/storage/emulated/0/Download/app-release.apk的权限:用户10390和当前进程都没有android.permission.write_外部_存储

更新活动代码 清单权限
我在您的代码中查找了一些内容,但我觉得一切都很好。我将此作为答案发布,因为它太长,无法发表评论

我能建议的最后一件事是,因为这只发生在三星S8和S9上,可能与安装/下载未知来源文件的权限有关。在您的三星手机中,请访问:

设置
-->
锁定屏幕和安全
-->
安装未知应用


然后试着为您的应用程序打开它。

作为一个简短的旁注,如果您已经有写权限,您不需要读权限,只要写就足够了。我自己也在想,谢谢。关于我与三星手机的问题,您知道吗?您也在清单中声明了权限吗?是的,我已经声明了。老实说,我不确定,它可能与路径有关,与您从
环境中获取路径的方式有关。我想我不知道答案,而且很难复制。我已经尝试过了,而且我在下载点遇到了异常,并且没有启动我的安装意图。@user3132471那么我不知道:)也许可以尝试在你的应用程序在
onCreate
中启动后立即移动权限,为了确保在下载之前有权限。就是这样,我在我的登录页面请求权限,然后进入更新活动。谢谢你的帮助。
    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" />