第一行代碼 8.4 播放音頻文件
(不一定有答案,就記錄一下,萬一找到了解決方法就可以方便大家了)
解決
應該問題是在於Android後面的權限問題,在書上使用的代碼使用的明文路徑。
在配置文件中添加 允許請求外部存儲 即可
即在AndroidManifest.xml文件中…還是直接附上代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.playaudiotest">
<uses-permission android:name="android.permission.WRITE_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:usesCleartextTraffic="true"
--------------------------------------------------
android:requestLegacyExternalStorage="true"> |
--------------------------------------------------
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
8.4.1
已確認代碼無誤,權限已加,手機根目錄已放置相應同名文件。
使用真機運行的代碼(手機型號:redmi K20)模擬器也嘗試不成功,點擊按鈕後無效。
報錯如下:
E/MediaPlayerNative: start called in state 1, mPlayer(0x0)
error (-38, 0)
E/MediaPlayer: Error (-38,0)
E/MediaPlayerNative: start called in state 0, mPlayer(0x0)
按這篇博客的說法 出現上面的報錯可能是路徑不對,因爲權限我已經添加上了。
https://blog.csdn.net/a277163145/article/details/46888975
這裏還是使用的書上的代碼,我在下面這段代碼打印了一下文件的路徑是否存在
private void initMediaPlayer(){
try{
File file=new File(Environment.getExternalStorageDirectory(),"music.mp3");
Log.d("AAA", "initMediaPlayer: "+file.getPath());
mediaPlayer.setDataSource(file.getPath());
mediaPlayer.prepare();
}catch (Exception e){
e.printStackTrace();
}
}
打印出的結果爲:
com.example.playaudiotest D/AAA: initMediaPlayer: /storage/emulated/0/music.mp3
這應該是意味着文件是存在的。
下面嘗試修改一下路徑進行嘗試:
private void initMediaPlayer(){
try{
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file=new File(Environment.getExternalStorageDirectory(),"music.mp3");
String path="/storage/emulated/0/1/music.mp3";
//
Log.d("AAA", "initMediaPlayer: "+path);
mediaPlayer.setDataSource(file.getPath());
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
}
}catch (Exception e){
e.printStackTrace();
}
}
爲了查找如何獲取文件路徑觀看了:https://blog.csdn.net/u012758497/article/details/85077749
(爲了避免path的有轉義字符的存在,我打印了path的字符(java字符串有點忘了)hahhah
打印結果:/storage/emulated/0/1/music.mp3)
添加後依舊報一樣的錯誤。
回去後繼續百度…