誰も信用するな!Androidではな!
はーい。タイトルと全然関係ないこと書きまーす。
そもそもタイトルの意味がわからねー!!
ということで、今回紹介するかわいそうなAndroidのAPIはこちら。
RingtoneManager | Android Developers
そう!RingtoneManagerだよー!
完璧にテンションがおかしい状態で書いてるよ-!
さてさて、本題。
RingtoneManagerのgetCursorメソッドが事の発端。
RingtoneManager | Android Developers
こいつよー、KKで呼び出すとよー、SecurityExceptionはきやがる!
コードはこんな感じ。manifestにPermissionは何も指定してない。だって、getCursorメソッド呼び出すのにPermission必要とか書いてないし。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RingtoneManager ringtoneManager = new RingtoneManager(this); Cursor cursor = ringtoneManager.getCursor(); } }
エラー内容はこんな感じ。
E/DatabaseUtils(15288): Writing exception to parcel E/DatabaseUtils(15288): java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=15625, uid=10179 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() E/DatabaseUtils(15288): at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:467) E/DatabaseUtils(15288): at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394) E/DatabaseUtils(15288): at android.content.ContentProvider$Transport.query(ContentProvider.java:194) E/DatabaseUtils(15288): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) E/DatabaseUtils(15288): at android.os.Binder.execTransact(Binder.java:404) E/AndroidRuntime(15625): FATAL EXCEPTION: main E/AndroidRuntime(15625): Process: com.operando.os.ringtonemanagersample, PID: 15625 E/AndroidRuntime(15625): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.operando.os.ringtonemanagersample/com.operando.os.ringtonemanagersample.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=15625, uid=10179 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() E/AndroidRuntime(15625): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) E/AndroidRuntime(15625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) E/AndroidRuntime(15625): at android.app.ActivityThread.access$800(ActivityThread.java:135) E/AndroidRuntime(15625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) E/AndroidRuntime(15625): at android.os.Handler.dispatchMessage(Handler.java:102) E/AndroidRuntime(15625): at android.os.Looper.loop(Looper.java:136) E/AndroidRuntime(15625): at android.app.ActivityThread.main(ActivityThread.java:5001) E/AndroidRuntime(15625): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(15625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) E/AndroidRuntime(15625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) E/AndroidRuntime(15625): Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=15625, uid=10179 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() E/AndroidRuntime(15625): at android.os.Parcel.readException(Parcel.java:1465) E/AndroidRuntime(15625): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) E/AndroidRuntime(15625): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) E/AndroidRuntime(15625): at android.content.ContentProviderProxy.query(ContentProviderNative.java:413) E/AndroidRuntime(15625): at android.content.ContentResolver.query(ContentResolver.java:461) E/AndroidRuntime(15625): at android.content.ContentResolver.query(ContentResolver.java:404) E/AndroidRuntime(15625): at android.app.Activity.managedQuery(Activity.java:1796) E/AndroidRuntime(15625): at android.media.RingtoneManager.query(RingtoneManager.java:554) E/AndroidRuntime(15625): at android.media.RingtoneManager.getMediaRingtones(RingtoneManager.java:493) E/AndroidRuntime(15625): at android.media.RingtoneManager.getCursor(RingtoneManager.java:366) E/AndroidRuntime(15625): at com.operando.os.ringtonemanagersample.MainActivity.onCreate(MainActivity.java:16) E/AndroidRuntime(15625): at android.app.Activity.performCreate(Activity.java:5231) E/AndroidRuntime(15625): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) E/AndroidRuntime(15625): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) E/AndroidRuntime(15625): ... 9 more
要は、manifestにandroid.permission.READ_EXTERNAL_STORAGE宣言しろよ!ってことなんだよね。
でもねー。それReferenceに書いてないからね?
android.permission.READ_EXTERNAL_STORAGEが途中から追加されたPermissionなのは知ってるよ!
でもさー、なんか一言書いてくれないかなー!
下手するとJBでもダメか?今手元に端末ないから、確認できない(´・ω・`)
という、ただの愚痴。
もう少し調べてみよう。