java - Android के लिए READ_EXTERNAL_STORAGE अनुमति




music-player audio-player (6)

मैं उन्हें चलाने के लिए उपयोगकर्ताओं की डिवाइस पर मीडिया फ़ाइलों (संगीत) का उपयोग करने की कोशिश कर रहा हूं; एक आसान "हैलो वर्ल्ड" -म्यूजिक प्लेयर ऐप।

मैंने कुछ ट्यूटोरियल्स का अनुसरण किया है और वे मूल रूप से समान कोड देते हैं। लेकिन यह काम नहीं करेगा; यह दुर्घटनाग्रस्त रहता है और मुझे बताता है:

error.....
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=27696, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
....

अब, यह मेरी मैनिफ़ेस्ट फ़ाइल है:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="slimsimapps.troff" >

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


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

यह मेरी जावा-विधि है:

public void initialize() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    if (cursor == null) {
        // query failed, handle error.
    } else if (!cursor.moveToFirst()) {
        // no media on the device
    } else {
        do {
            addSongToXML(cursor);
        } while (cursor.moveToNext());
    }
}

मैंने कोशिश की है:

इसे मैनिफ़ेस्ट फ़ाइल में विभिन्न स्थानों पर रखने के लिए:

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

Android जोड़ने के लिए: maxSdkVersion पर बाहरी संग्रहण पढ़ें पढ़ें:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="21" />

इसे प्रकट / आवेदन / गतिविधि-टैग में डालने के लिए:

android:exported=“true

Javamethod में uri और शापो के बीच अनुदानप्राप्ति करना:

grantUriPermission(null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

इसका उपयोग करने के लिए, यह क्रैश नहीं होगा, लेकिन कर्सर शून्य हो जाएगा:

uri = MediaStore.Audio.Media.getContentUri("EXTERNAL_CONTENT_URI”);

आंतरिक सामग्री यूरी का उपयोग करने के लिए, यह अपेक्षा के अनुसार काम करता है, लेकिन यह केवल "ओएस-साउंड" देता है जैसे शटर-साउंड, लो-बैटरी-साउंड, बटन-क्लिक और जैसे:

uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

दलीलों की मदद, यह एक कठिन समस्या नहीं होनी चाहिए जिसे मैं जानता हूं, लेकिन मुझे ऐसा लगता है!

मैंने पढ़ा है और कोशिश की है (या उन्हें मेरी समस्या के लिए लागू नहीं माना जाता है):

स्टैक ट्रेस:

09-08 06:59:36.619    2009-2009/slimsimapps.troff D/AndroidRuntime Shutting down VM
    --------- beginning of crash
09-08 06:59:36.619    2009-2009/slimsimapps.troff E/AndroidRuntime FATAL EXCEPTION: main
    Process: slimsimapps.troff, PID: 2009
    java.lang.IllegalStateException: Could not execute method for android:onClick
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4452)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2009, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
            at android.os.Parcel.readException(Parcel.java:1599)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
            at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
            at android.content.ContentResolver.query(ContentResolver.java:491)
            at android.content.ContentResolver.query(ContentResolver.java:434)
            at slimsimapps.troff.MainActivity.initialize(MainActivity.java:106)
            at slimsimapps.troff.MainActivity.InitializeExternal(MainActivity.java:80)
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    --------- beginning of system

आपकी समस्या के लिए आपके पास दो समाधान हैं। त्वरित लक्ष्य को लक्ष्यएपीआई से घटाकर 22 (बिल्ड.ग्रेडल फाइल) करना है। दूसरा है नए और अद्भुत आस्क-फॉर-परमिशन मॉडल का उपयोग करना:

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (shouldShowRequestPermissionRationale(
            Manifest.permission.READ_EXTERNAL_STORAGE)) {
        // Explain to the user why we need to read the contacts
    }

    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant that should be quite unique

    return;
}

स्निपलेट यहां पाया गया: https://developer.android.com/training/permissions/requesting.html


आपने रन टाइम पर अनुमति मांगी है:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
        && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_PERMISSION);
    dialog.dismiss();
    return;
}

और नीचे कॉलबैक में आप बिना किसी समस्या के स्टोरेज तक पहुँच सकते हैं।

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission granted.
        } else {
            // User refused to grant permission.
        }
    }
}

क्या आपकी समस्या का समाधान हो चुका है? आपका लक्ष्य SDK क्या है? android;maxSDKVersion="21" जोड़ने का प्रयास करें android;maxSDKVersion="21" से <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


चरण 1: Android मैनिफ़ेस्ट.xml पर अनुमति जोड़ें

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

Step2: onCreate () विधि

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
    } else {
        readDataExternal();
    }

चरण 3: कॉलबैक पाने के लिए onRequestPeaksResult विधि को ओवरराइड करें

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_MEDIA:
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                readDataExternal();
            }
            break;

        default:
            break;
    }
}

नोट: readDataExternal () बाहरी संग्रहण से डेटा प्राप्त करने की विधि है।

धन्यवाद।


सभी उत्तरों के अतिरिक्त। आप इस एनोटेशन के साथ आवेदन करने के लिए minsdk भी निर्दिष्ट कर सकते हैं

@TargetApi(_apiLevel_)

मैंने इस अनुरोध को स्वीकार करने के लिए इसका उपयोग किया यहां तक ​​कि मेरा minsdk 18 है। यह क्या करता है कि विधि केवल तभी चलती है जब डिवाइस "_apilevel_" और ऊपरी को लक्षित करता है। यहाँ मेरी विधि है:

    @TargetApi(23)
void solicitarPermisos(){

    if (ContextCompat.checkSelfPermission(this,permiso)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (shouldShowRequestPermissionRationale(
                Manifest.permission.READ_EXTERNAL_STORAGE)) {
            // Explain to the user why we need to read the contacts
        }

        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                1);

        // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
        // app-defined int constant that should be quite unique

        return;
    }

}

http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html

लाइन contentResolver.query बदलने का प्रयास करें

//change it to the columns you need
String[] columns = new String[]{MediaStore.Audio.AudioColumns.DATA}; 
Cursor cursor = contentResolver.query(uri, columns, null, null, null);

सार्वजनिक स्थिर अंतिम स्ट्रिंग MEDIA_CONTENT_CONTROL

मीडिया की खपत की गोपनीयता के कारण तृतीय-पक्ष एप्लिकेशन द्वारा उपयोग के लिए नहीं

http://developer.android.com/reference/android/Manifest.permission.html#MEDIA_CONTENT_CONTROL

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/> पहले निकालने का प्रयास करें और फिर से प्रयास करें?







android-music-player