2015-09-07 10 views
54

ユーザーデバイス上のメディアファイル(音楽)にアクセスしようとしています。簡単な "こんにちは世界" - 音楽プレーヤーアプリ。Android用READ_EXTERNAL_STORAGE権限

私はいくつかのチュートリアルに続き、基本的に同じコードを与えています。しかし、それは動作しません。それがクラッシュして私に言って続けて:

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() 
.... 

さて、これは私のマニフェストファイルです:私が試してみました

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()); 
    } 
} 

これは私のJavaのメソッドである

<?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> 

は、

マニフェストファイルの別の場所に貼り付ける:

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

アンドロイド追加するには、次のURIの間grantUriPremissionを置くため

android:exported=“true” 

:読む外部記憶premissionでmaxSdkVersion:

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

マニフェスト/アプリケーション/アクティビティタグでこれを置くことをjavamethodのカーソロ:

grantUriPermission(null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
これを使用するには

、それはクラッシュしませんが、カーソルがゼロになる:

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

INTERNALコンテンツのURIを使用するには、予想通り、これは動作しますが、それだけで、このようなシャッター音などの「OS-音」を与えます、低バッテリー音、ボタンクリックして、このような:

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 
+0

あなたがこの行を与えられていないときに、エラーが表示されている奇妙なマニフェスト<使用許可アンドロイド:名=「android.permission.READ_EXTERNAL_STORAGE」/>あなたはいくつかのファイルを読み込むしようとしています他のアプリで保護されていますか? –

+0

どのAPIレベルでこれを試していますか? –

+0

プロジェクトのクリーニングを試しましたか? ? –

答えて

53

を:

public class MainActivity extends Activity{ 

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

} 

public void getAllSongsFromSDCARD() { 
    String[] STAR = { "*" }; 
    Cursor cursor; 
    Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 

    cursor = managedQuery(allsongsuri, STAR, selection, null, null); 

    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      do { 
       String song_name = cursor 
         .getString(cursor 
           .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 
       int song_id = cursor.getInt(cursor 
         .getColumnIndex(MediaStore.Audio.Media._ID)); 

       String fullpath = cursor.getString(cursor 
         .getColumnIndex(MediaStore.Audio.Media.DATA)); 

       String album_name = cursor.getString(cursor 
         .getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
       int album_id = cursor.getInt(cursor 
         .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 

       String artist_name = cursor.getString(cursor 
         .getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
       int artist_id = cursor.getInt(cursor 
         .getColumnIndex(MediaStore.Audio.Media.ARTIST_ID)); 
       System.out.println("sonng name"+fullpath); 
      } while (cursor.moveToNext()); 

     } 
     cursor.close(); 
    } 
} 


} 

私は以下のようにファイルのAndroidManifest.xmlに以下の行をも追加されましたあなたの問題には2つの解決策があります。速いのは、targetApiを22(build.gradleファイル)に下げることです。 第二には、新しい、素晴らしい尋ねる-のために許可モデルを使用することです:

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; 
} 

Snipletはこちらをご覧ください:https://developer.android.com/training/permissions/requesting.html

+1

はい、もちろんです!新しいアクセス許可モデルGoogleが最新のAndroidを導入しました!ありがとう、私はできるだけ早くこれをテストし、それが動作すれば正しいことをマークします! (これは忘れ去られたと思い始めました) –

+0

要求されている権限は 'READ_EXTERNAL_STORAGE'である必要があります。 [この回答](http://stackoverflow.com/a/35720050/1432239)のように。 – maclir

+0

swap!= PackageManager.READ_EXTERNAL_STORAGE for!= PackageManager.PERMISSION_GRANTED – Renascienza

0

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); 

のpublic static final文字列MEDIA_CONTENT_CONTROL

メディア消費

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

のプライバシーへのサードパーティ製のアプリケーションで使用するために

ないが<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>最初を削除して再試行してみては?

+0

ありがとう、私はあなたの提案を試みたが、それは同じ場所でクラッシュした...私は、Macを使用している問題はありますか? –

+0

が更新されました。 ''を削除してみてください。あなたのアプリケーションの許可要求が許可されていないために奇妙な動作が発生する可能性があります –

+0

ありがとう、私はその許可を削除しようとしましたが、同じエラーで同じ場所でクラッシュします... –

0

あなたはSDカードからすべての音楽ファイルを見つけることができることを利用していること、コードの下に確認してください:あなたは

<uses-sdk 
    android:minSdkVersion="16" 
    android:targetSdkVersion="17" /> 

<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" /> 
+0

ありがとう、あなたのコードを試して、 "カーソル= managedQuery(allsongsuri、STAR、選択、null、null);"、以前と同じエラーでクラッシュします。ところで; managedQueryは廃止されましたが、同じ入力パラメータを持つ「contentResolver.query」に変更するとクラッシュします。 –

+0

こんにちは、上記のコードを使用してすべてのsdcadrの曲を取得できます。 Androidバージョン4.2.2デバイスを搭載し、バージョン5.0.2でも使用できます。あなたが試みているところです。あなたが得たエラーは、Androidバージョン –

+0

で記述してください。私はスタックトレースで質問を更新しました。 Androidバージョンの意味は? (私はAPK 23を使用しています) –

2

はあなたの問題は解決されていますか?あなたのターゲットSDKは何ですか?

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; 
} 

そして、あなたは問題なくストレージにアクセスすることができます下のコールバックでは:あなたは、実行時に許可を求めてきたandroid;maxSDKVersion="21"<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

+0

AndroidManifest.xmlの最大SDKバージョンのみを22(23ではなく)に設定して、Cordovaを使用して私の仕事をしてください –

+0

あなたのアプリはまだマシュマロ以上で動作しますか? –

9

を追加してみてください。

@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. 
     } 
    } 
} 
1

ステップ1:アンドロイドマニフェストの許可を追加します。XML

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

ステップ2:の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:コールバック

@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; 
    } 
} 

注取得するonRequestPermissionsResultオーバーライドメソッド:readDataExternal()は、外部記憶装置からデータを取得する方法です。

ありがとうございました。

+0

私はREAD_EXTERNAL_STORAGEが必要な許可を間違っていると思います。 – Renascienza

+0

はい、どうもありがとうございます。 – sonnv1368

-1

「デバイス」の下の「設定」に移動して「アプリ」を選択し、MY_APPLICATIONまでスクロールして「ストレージ」権限を与えます。

+1

私はそれが事実ではないと思う...彼は彼のプロジェクトではなく、スマートフォン自体でこれを行う必要があります。 – BrunoDM

2

私はまた、同様のエラーログを持っていたし、ここで私たちは権限に結果をチェックする

ActivityCompat.requestPermissions(MainActivity.this, 
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1); 
  • 方法を確認するためのダイアログボックスを要求するのonCreateメソッドで

    1. をdid-何

      @Override 
      public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
      switch (requestCode) { 
          case 1: { 
           // If request is cancelled, the result arrays are empty. 
           if (grantResults.length > 0 
             && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
            // permission granted and now can proceed 
           mymethod(); //a sample method called 
      
           } else { 
      
            // permission denied, boo! Disable the 
            // functionality that depends on this permission. 
            Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show(); 
           } 
           return; 
          } 
          // add other cases for more permissions 
          } 
      } 
      

    公式ドキュメントRequesting Runtime Permissions

  • +1

    私はそれを使用し、それは完璧に動作すべてのアンドロイドデバイスで動作しますか? –

    +0

    はいすべてのデバイスで動作します –

    0

    すべての回答に加えて、 ます。また、この注釈

    @TargetApi(_apiLevel_) 
    

    に適用するminsdkを指定することができ、私も私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; 
        } 
    
    }