誰も信用するな!Androidではな!

はーい。タイトルと全然関係ないこと書きまーす。

そもそもタイトルの意味がわからねー!!

ということで、今回紹介するかわいそうなAndroidAPIはこちら。

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でもダメか?今手元に端末ないから、確認できない(´・ω・`)

という、ただの愚痴。

もう少し調べてみよう。