मैं उन्हें चलाने के लिए उपयोगकर्ता डिवाइस पर मीडिया फ़ाइलों (संगीत) का उपयोग करने की कोशिश कर रहा हूं; एक आसान "हैलो वर्ल्ड" -म्यूजिक प्लेयर ऐप।
मैंने कुछ ट्यूटोरियल्स का अनुसरण किया है और वे मूल रूप से समान कोड देते हैं। लेकिन यह काम नहीं करेगा; यह दुर्घटनाग्रस्त रहता है और मुझे बताता है:
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;
दलीलों की मदद, यह एक कठिन समस्या नहीं होनी चाहिए जिसे मैं जानता हूं, लेकिन मुझे ऐसा लगता है!
मैंने पढ़ा है और कोशिश की है (या उन्हें मेरी समस्या के लिए लागू नहीं माना जाता है):
- Android READ_EXTERNAL_STORAGE अनुमति नहीं काम कर रही है
- केवल पुराने Android संस्करणों के लिए अनुमति की आवश्यकता है: maxSdkVersion काम नहीं करता है?
- मीडियास्टार से URI से फ़ाइल नाम और पथ प्राप्त करें
- MediaStore से पढ़ने की कोशिश करते समय Android KitKat securityException
- एंड्रॉइड: java.lang.SecurityException: अनुमति अस्वीकृत: प्रारंभ करें
स्टैक ट्रेस:
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