SecurityException: отказ от разрешения: открытие провайдера

У меня есть следующая проблема. Мы создали приложение Game Center, которое обеспечивает основу для создания ad hoc wifi-игр и управляет рекордами / встречами таких игр.

Доступ к базам данных для рекордов осуществляется с помощью провайдера:

<provider android:name="com.identifier.gamecenterapp.contentprovider.MyGamesContentProvider" android:authorities="com.identifier.gamecenterapp.contentprovider" > </provider> 

Наша демо-игра (как ссылка для будущих разработчиков игр) содержит следующие разрешения:

 <uses-permission android:name="com.identifier.gamecenterapp.contentprovider.READ_DATABASE"/> <uses-permission android:name="com.identifier.gamecenterapp.contentprovider.WRITE_DATABASE"/> 

Теперь – всякий раз, когда мы пытаемся получить доступ к провайдеру с игрой, мы получаем следующую ошибку:

 09-17 12:15:52.221: E/AndroidRuntime(4551): FATAL EXCEPTION: main 09-17 12:15:52.221: E/AndroidRuntime(4551): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.identifier.gamecenter.gctictactoe/com.identifier.gamecenter.game.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.identifier.gamecenterapp.contentprovider.MyGamesContentProvider from ProcessRecord{42622078 4551:com.identifier.gamecenter.gctictactoe/u0a10108} (pid=4551, uid=10108) that is not exported from uid 10072 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread.access$600(ActivityThread.java:141) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.os.Handler.dispatchMessage(Handler.java:99) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.os.Looper.loop(Looper.java:137) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread.main(ActivityThread.java:5103) 09-17 12:15:52.221: E/AndroidRuntime(4551): at java.lang.reflect.Method.invokeNative(Native Method) 09-17 12:15:52.221: E/AndroidRuntime(4551): at java.lang.reflect.Method.invoke(Method.java:525) 09-17 12:15:52.221: E/AndroidRuntime(4551): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-17 12:15:52.221: E/AndroidRuntime(4551): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-17 12:15:52.221: E/AndroidRuntime(4551): at dalvik.system.NativeStart.main(Native Method) 09-17 12:15:52.221: E/AndroidRuntime(4551): Caused by: java.lang.SecurityException: Permission Denial: opening provider c.identifier.gamecenterapp.contentprovider.MyGamesContentProvider from ProcessRecord{42622078 4551:com.identifier.gamecenter.gctictactoe/u0a10108} (pid=4551, uid=10108) that is not exported from uid 10072 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.os.Parcel.readException(Parcel.java:1431) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.os.Parcel.readException(Parcel.java:1385) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2611) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread.acquireProvider(ActivityThread.java:4515) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2036) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1149) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.content.ContentResolver.query(ContentResolver.java:398) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.content.ContentResolver.query(ContentResolver.java:357) 09-17 12:15:52.221: E/AndroidRuntime(4551): at ch.ethz.csg.wlanopp.gapi.GameCenterController.getIdByGameTitle(GameCenterController.java:602) 09-17 12:15:52.221: E/AndroidRuntime(4551): at ch.ethz.csg.wlanopp.gapi.GameCenterController.isRegistered(GameCenterController.java:343) 09-17 12:15:52.221: E/AndroidRuntime(4551): at ch.ethz.csg.wlanopp.gapi.GameCenterController.addGame(GameCenterController.java:352) 09-17 12:15:52.221: E/AndroidRuntime(4551): at ch.ethz.csg.gamecenter.gctictactoe.MainActivity.onCreate(MainActivity.java:130) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.Activity.performCreate(Activity.java:5133) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 09-17 12:15:52.221: E/AndroidRuntime(4551): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 09-17 12:15:52.221: E/AndroidRuntime(4551): ... 11 more 09-17 12:20:52.487: I/Process(4551): Sending signal. PID: 4551 SIG: 9 

Странно, что это сработало довольно долго. Ошибка только на Android 4.3, предыдущие версии (например, протестировали 4.1) не имели этой проблемы.

Благодарим вас за понимание того, как это можно решить.

Ниже Android 4.3 значение по умолчанию «экспортировано» вашего провайдера установлено равным true. В Android 4.3 установлено значение false.

 <provider android:name="com.identifier.gamecenterapp.contentprovider.MyGamesContentProvider" android:authorities="com.identifier.gamecenterapp.contentprovider" android:exported="true"> </provider> 

И это сработает.