微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android通过uri结果使用SecurityExcepption访问文件

如何解决Android通过uri结果使用SecurityExcepption访问文件

我遇到了安全异常。我将音频文件保存在我的应用程序中并可以播放。在设备重新启动之前,它可以正常工作。重新启动应用程序后,麻烦开始了。

我想做的只是启动一个从URI创建的媒体播放器。这是我的方法: 首先,我创建ForegroundService,其创建方式如下:

Intent sceneservice = new Intent(context,SceneManager.class);
sceneservice.putExtra("file",mFile);
context.startForegroundService(sceneservice);

然后该服务启动媒体播放器类以启动音频文件

public class SceneManager extends Service
{
    @Override
    public int onStartCommand(Intent intent,int flags,int startId)
    {
       GameAudioPlayer player = GameAudioPlayer.getInstance();
       player.startScene(this,audio)
    }
}

GameAudioPlayer可以进行以下操作:

MediaPlayer player = MediaPlayer.create(context,Uri.parse(mFile.getUri()));
player.start()

结果是:

W/MediaPlayer: Couldn't open content://com.android.externalstorage.documents/document/primary:Music/my/path/to/file.mp3
    java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider from ProcessRecord{2b6811f 18501:com.wintermute.adventuresmaster/u0a351} (pid=18501,uid=10351) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
        at android.os.Parcel.createException(Parcel.java:2071)
        at android.os.Parcel.readException(Parcel.java:2039)
        at android.os.Parcel.readException(Parcel.java:1987)
        at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:5156)
        at android.app.ActivityThread.acquireProvider(ActivityThread.java:6807)
        at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2762)
        at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:2163)
        at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1689)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1521)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1438)
        at android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1127)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1099)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1011)
        at android.media.MediaPlayer.create(MediaPlayer.java:918)
        at android.media.MediaPlayer.create(MediaPlayer.java:895)
        at android.media.MediaPlayer.create(MediaPlayer.java:874)
        at com.wintermute.adventuresmaster.services.player.GameAudioPlayer.preparePlayer(GameAudioPlayer.java:115)
        at com.wintermute.adventuresmaster.services.player.GameAudioPlayer.lambda$playScene$1$GameAudioPlayer(GameAudioPlayer.java:99)
        at com.wintermute.adventuresmaster.services.player.-$$Lambda$GameAudioPlayer$nydFlov8edpl3wGxNrMmFC7swLI.accept(UnkNown Source:6)
        at java.util.ArrayList.forEach(ArrayList.java:1262)
        at com.wintermute.adventuresmaster.services.player.GameAudioPlayer.playScene(GameAudioPlayer.java:99)
        at com.wintermute.adventuresmaster.services.player.SceneManager.onStartCommand(SceneManager.java:84)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4204)
        at android.app.ActivityThread.access$2100(ActivityThread.java:231)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1984)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: android.os.remoteexception: Remote stack trace:
        at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:7700)
        at com.android.server.am.ActivityManagerService.getContentProvider(ActivityManagerService.java:8028)
        at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2127)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3015)
        at android.os.Binder.execTransactInternal(Binder.java:1032)
E/MediaPlayerNative: Unable to create media player

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。