应用程序在按下按钮时崩溃 2.9 版的 Genymotion 但适用于 2.8

App crashes on button press 2.9 version of Genymotion but works on 2.8

我的应用 Alarm 中有两个活动,在 Genymotion 2.8Genymotion 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 可以。