TL;DR:當我嘗試讀取服務中的檔案 (Uri) 時出現以下錯誤,出現以下錯誤:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider
我正在嘗試做的事情:
a) 在特定時間讀取音頻檔案
b) 可以選擇使用應用程式界面停止媒體播放器 (stopService())
c) 確保即使應用程式關閉,音頻仍然可以播放
我是怎么做的:
- 在主活動中使用 ACTION_GET_CONTENT 選擇音頻檔案
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())
{ result ->if (result.resultCode == RESULT_OK) {
val data: Intent? = result.data
fileUri = data?.data!!
}
}
val intent = Intent()
.setType("audio/*")
.setAction(Intent.ACTION_GET_CONTENT)
使用掛起的意圖 AlarmManager 設定警報,并使用 extras 將 Uri(作為字串)傳遞給 AlarmManager
val alarmIntent = Intent(context,AlarmSetter::class.java) alarmIntent.action = "SET_ALARM" alarmIntent.putExtra("audio_path",fileUri.toString()) alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager var pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0) alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)呼叫接收器中的服務并將 Uri 傳遞給意圖覆寫中的服務 fun onReceive(context: Context?, intent: Intent?) {
val filePath = intent?.getStringExtra("audio_path") val musicIntent = Intent(context, MusicService::class.java) musicIntent.putExtra("audio_path",filePath) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context?.startForegroundService(musicIntent)} else{ context?.startService(musicIntent) }讀取服務中的檔案
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
...
notification()
...
val mp = MediaPlayer.create(this, Uri.parse(intent?.getStringExtra("audio_path")))
...
問題:
當應用程式仍在運行時,服務發送通知并由媒體播放器讀取音頻檔案。
但是,當應用程式被終止/退出時,會發送通知但無法讀取檔案,因為該服務沒有打開它的權限。
更新:我接受了 CommonsWare 的回答,但是為了清楚起見,我將添加對我有用的代碼:
在步驟 2) 中代替
alarmIntent.putExtra("audio_path",fileUri.toString())
做
alarmIntent.data = fileUri
在步驟 3) 中:
val fileUri = intent?.data
val musicIntent = Intent(context, MusicService::class.java)
musicIntent.data = fileUri
musicIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION)
musicIntent.addFlags(FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
更新 2:該解決方案不適用于 SDK 25
uj5u.com熱心網友回復:
用putExtra()呼叫替換您的呼叫setData()并添加addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)到每個出站Intent物件中。并且,用getStringExtra()電話替換您的getData()電話。
這將在 的“資料”方面將您Uri作為實際傳遞,并在您遍歷行程和組件邊界時傳遞讀取權限。UriIntent
有關更多資訊,請參閱此博客文章。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340893.html
上一篇:Toast和廣播接收器不起作用
