Android Studio(java)-访问存储权限被拒绝?

时间:2018-11-15 18:48:18

标签: java android

我一直在尝试访问手机的存储空间。 我放了清单:

  <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

我还要求在mainactivity中获得权限,并为应用程序提供了必需的权限。

尽管该应用程序具有权限,但是在运行代码时收到此错误:

I/System.out: /storage/emulated/0/Music
W/System.err: com.sapher.youtubedl.YoutubeDLException: Cannot run program "youtube-dl" (in directory "/storage/emulated/0/Music"): error=13, Permission denied
W/System.err:     at com.sapher.youtubedl.YoutubeDL.execute(YoutubeDL.java:69)
                  at net.musify.liel.musify.MainActivity.onCreate(MainActivity.java:40)
                  at android.app.Activity.performCreate(Activity.java:7183)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
                  at android.app.ActivityThread.-wrap11(Unknown Source:0)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
                  at android.os.Handler.dispatchMessage(Handler.java:105)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6938)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

有什么想法吗?

编辑:

private boolean permissions;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkPermissions();

        if(permissions) {
            String videoUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";

            System.out.println(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC));
            String directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();

            YoutubeDLRequest request = new YoutubeDLRequest(videoUrl, directory);
            request.setOption("ignore-errors");     // --ignore-errors
            request.setOption("output", "%(id)s");  // --output "%(id)s"
            request.setOption("retries", 10);       // --retries 10

            // Make request and return response
            try {
                YoutubeDLResponse response = YoutubeDL.execute(request);
                String stdOut = response.getOut(); // Executable output
                System.out.println(stdOut);
            } catch(Exception e) {
                e.printStackTrace();
            }
            //Downloader.download("2FFdYZ1ZsbA");
        }
    }

    public 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
                || ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions();
        } else {
            permissions = true;
        }
    }


    private final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
    public void requestPermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_CONTACTS)) {
                requestPermissions();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.INTERNET},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);
            }
        } else {
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    this.permissions = true;
                } else {
                    this.permissions = false;
                    Toast.makeText(this, "Musify needs permissions in order to run properly!", Toast.LENGTH_SHORT).show();;
                    System.exit(0);
                }
                return;

}

        // other 'case' lines to check for other
        // permissions this app might request.
    }
}

这是带有运行时权限请求的更新代码。

1 个答案:

答案 0 :(得分:0)

您需要像这样检查存储的运行时权限

public void checkPermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
            return true;
        } else {

            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG,"Permission is granted");
        return true;
    }
}

以及您的结果回调中

    @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
        Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
        //resume tasks needing this permission
    }
}