应用程序在按下按钮时崩溃 2.9 版的 Genymotion 但适用于 2.8
App crashes on button press 2.9 version of Genymotion but works on 2.8
我的应用 Alarm
中有两个活动,在 Genymotion 2.8
和 Genymotion 2.9
上都运行良好。
我还有一个 Media Player
,它在 2.8 上运行良好,但在我按下 MediaPlayer 按钮时在 2.9 上崩溃。
这是我的闹钟屏幕 activity:
这是我在 2.9 上按下按钮后得到的屏幕:
.
这是我按下 phone 上的按钮后的 logcat:
09-01 16:12:06.451 31541-31541/com.never.mediaalarmplayer E/AndroidRuntime:致命异常:main
进程:com.never.mediaalarmplayer,PID:31541
java.lang.RuntimeException:无法启动 activity ComponentInfo{com.never.mediaalarmplayer/com.never.mediaalarmplayer.MediaPlayer}:java.lang.SecurityException:权限被拒绝:读取 com.android.providers.media.MediaProvider uri 内容://media/external/audio/media 来自 pid=31541,uid=10174 需要 android.permission.READ_EXTERNAL_STORAGE,或 grantUriPermission()
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
在 android.app.ActivityThread.-wrap12(ActivityThread.java)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
在 android.os.Handler.dispatchMessage(Handler.java:110)
在 android.os.Looper.loop(Looper.java:203)
在 android.app.ActivityThread.main(ActivityThread.java:6251)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=31541, uid=10174 requires android.permission.READ_EXTERNAL_STORAGE, 或者grantUriPermission()
在 android.os.Parcel.readException(Parcel.java:1683)
在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
在 android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
在 android.content.ContentResolver.query(ContentResolver.java:537)
在 android.content.ContentResolver.query(ContentResolver.java:479)
在 com.never.mediaalarmplayer.MediaPlayer.getSongList(MediaPlayer.java:138)
在 com.never.mediaalarmplayer.MediaPlayer.onCreate(MediaPlayer.java:41)
在 android.app.Activity.performCreate(Activity.java:6666)
在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
在 android.app.ActivityThread.-wrap12(ActivityThread.java)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
在 android.os.Handler.dispatchMessage(Handler.java:110)
在 android.os.Looper.loop(Looper.java:203)
在 android.app.ActivityThread.main(ActivityThread.java:6251)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
我已经在清单中插入了请求权限的命令,但可能还需要更多:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.never.mediaalarmplayer">
android:versionCode = "1"
android:versionName="1.0">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:fullBackupContent="@xml/backup_descriptor">
<activity android:name=".Alarm"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MediaPlayer"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:label="@string/app_name"
/>
<service android:name="com.never.mediaalarmplayer.MusicService" />
<receiver android:name=".AlarmReceiver"/>
</application>
</manifest>
Logcat 2.9:
09-02 06:34:47.269 666-677/system_process I/ActivityManager: START u0 {cmp=com.never.mediaalarmplayer/.MediaPlayer} from uid 10060 on display 0
09-02 06:34:47.269 666-723/system_process W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 48000 Hz, output 44100 Hz
09-02 06:34:47.313 1148-1167/android.process.media E/DatabaseUtils: Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2012, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:507)
09-02 06:34:47.313 2012-2012/com.never.mediaalarmplayer D/AndroidRuntime: Shutting down VM
09-02 06:34:47.318 2012-2012/com.never.mediaalarmplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.never.mediaalarmplayer, PID: 2012
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.never.mediaalarmplayer/com.never.mediaalarmplayer.MediaPlayer}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2012, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
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=2012, uid=10060 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 com.never.mediaalarmplayer.MediaPlayer.getSongList(MediaPlayer.java:138)
at com.never.mediaalarmplayer.MediaPlayer.onCreate(MediaPlayer.java:41)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
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)
它在我的 phone 上也不起作用 - 我的诺基亚 3 Android 7.0.
谢谢你的回答!
根据这部分logcat:
EXCEPTION: main Process: com.never.mediaalarmplayer, PID: 31541 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.never.mediaalarmplayer/com.never.mediaalarmplayer.MediaPlayer}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=31541, uid=10174 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
您的应用程序正在尝试访问外部存储,因此您必须将匹配的权限添加到您的 Android 清单文件中。查看 https://developer.android.com/guide/topics/data/data-storage.html#filesExternal 了解更多详情。
READ_EXTERNAL_STORAGE 是自 Android 6.0 以来的运行时权限。
在清单中添加权限请求是不够的。应用程序应在 运行 时间内请求权限。如果您不想这样做,请更改为 22 或更少。
崩溃的原因存在于Genymotion的实现中。恕我直言(我的猜测),Genymotion 2.8 中的 MediaProvider 无法访问外部存储,但 2.9 可以。
我的应用 Alarm
中有两个活动,在 Genymotion 2.8
和 Genymotion 2.9
上都运行良好。
我还有一个 Media Player
,它在 2.8 上运行良好,但在我按下 MediaPlayer 按钮时在 2.9 上崩溃。
这是我的闹钟屏幕 activity:
这是我在 2.9 上按下按钮后得到的屏幕:
这是我按下 phone 上的按钮后的 logcat:
09-01 16:12:06.451 31541-31541/com.never.mediaalarmplayer E/AndroidRuntime:致命异常:main 进程:com.never.mediaalarmplayer,PID:31541 java.lang.RuntimeException:无法启动 activity ComponentInfo{com.never.mediaalarmplayer/com.never.mediaalarmplayer.MediaPlayer}:java.lang.SecurityException:权限被拒绝:读取 com.android.providers.media.MediaProvider uri 内容://media/external/audio/media 来自 pid=31541,uid=10174 需要 android.permission.READ_EXTERNAL_STORAGE,或 grantUriPermission() 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6251) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=31541, uid=10174 requires android.permission.READ_EXTERNAL_STORAGE, 或者grantUriPermission() 在 android.os.Parcel.readException(Parcel.java:1683) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140) 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 在 android.content.ContentResolver.query(ContentResolver.java:537) 在 android.content.ContentResolver.query(ContentResolver.java:479) 在 com.never.mediaalarmplayer.MediaPlayer.getSongList(MediaPlayer.java:138) 在 com.never.mediaalarmplayer.MediaPlayer.onCreate(MediaPlayer.java:41) 在 android.app.Activity.performCreate(Activity.java:6666) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6251) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
我已经在清单中插入了请求权限的命令,但可能还需要更多:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.never.mediaalarmplayer">
android:versionCode = "1"
android:versionName="1.0">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:fullBackupContent="@xml/backup_descriptor">
<activity android:name=".Alarm"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MediaPlayer"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:label="@string/app_name"
/>
<service android:name="com.never.mediaalarmplayer.MusicService" />
<receiver android:name=".AlarmReceiver"/>
</application>
</manifest>
Logcat 2.9:
09-02 06:34:47.269 666-677/system_process I/ActivityManager: START u0 {cmp=com.never.mediaalarmplayer/.MediaPlayer} from uid 10060 on display 0
09-02 06:34:47.269 666-723/system_process W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 48000 Hz, output 44100 Hz
09-02 06:34:47.313 1148-1167/android.process.media E/DatabaseUtils: Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2012, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:507)
09-02 06:34:47.313 2012-2012/com.never.mediaalarmplayer D/AndroidRuntime: Shutting down VM
09-02 06:34:47.318 2012-2012/com.never.mediaalarmplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.never.mediaalarmplayer, PID: 2012
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.never.mediaalarmplayer/com.never.mediaalarmplayer.MediaPlayer}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2012, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
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=2012, uid=10060 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 com.never.mediaalarmplayer.MediaPlayer.getSongList(MediaPlayer.java:138)
at com.never.mediaalarmplayer.MediaPlayer.onCreate(MediaPlayer.java:41)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
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)
它在我的 phone 上也不起作用 - 我的诺基亚 3 Android 7.0.
谢谢你的回答!
根据这部分logcat:
EXCEPTION: main Process: com.never.mediaalarmplayer, PID: 31541 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.never.mediaalarmplayer/com.never.mediaalarmplayer.MediaPlayer}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=31541, uid=10174 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
您的应用程序正在尝试访问外部存储,因此您必须将匹配的权限添加到您的 Android 清单文件中。查看 https://developer.android.com/guide/topics/data/data-storage.html#filesExternal 了解更多详情。
READ_EXTERNAL_STORAGE 是自 Android 6.0 以来的运行时权限。 在清单中添加权限请求是不够的。应用程序应在 运行 时间内请求权限。如果您不想这样做,请更改为 22 或更少。
崩溃的原因存在于Genymotion的实现中。恕我直言(我的猜测),Genymotion 2.8 中的 MediaProvider 无法访问外部存储,但 2.9 可以。