java - 媒体播放器是一个空对象,当由从广播接收器启动的活动制作时
问题描述
我正在尝试从广播接收器打开的活动中播放 MediaPlayer。如果我从 R.raw 文件夹播放内部文件,这很好用。但是,如果我尝试通过 URI 访问 Mp3 文件,它就不再起作用了。
public class AlarmScreen extends AppCompatActivity {
MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_screen);
mediaPlayer = new MediaPlayer();
startMusic();
}
private void startMusic() {
String stringUri = element.getUri();
if (!(stringUri.equals(""))){
Uri uri = Uri.parse(stringUri);
mediaPlayer = MediaPlayer.create(this, uri);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mediaPlayer.start();
}
}, 1000);
}
}
我得到的错误如下所示:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
我还尝试按以下方式制作媒体播放器,但结果相同:
Uri uri = Uri.parse(stringUri);
try {
mediaPlayer.setDataSource(this, uri);
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mediaPlayer.start();
}
}, 300);
我想问题出在权限内,因为据我所知,BroadCastReceivers 没有与普通应用程序相同的权限。如果您需要更多代码,请告诉我。
编辑:
我通过制作以下测试项目缩小了问题范围:这里创建了 2 个 Uris。对于 Uri1,我使用来自选择器的数据。对于 Uri2,我使用上一轮的 Uri-String。然后这些 Uris 在 start() 中播放。如果我玩 Uri1,它总是有效。但是如果我玩 Uri2,它只有在 Uri1 等于 Uri2 时才有效。只有在选择器中再次选择相同的音乐文件时才会出现这种情况,就像我最初复制 Uri2 的那轮一样。
我真的不明白我做错了什么。还有其他方法可以从您的设备访问音乐文件吗?
private void play(){
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(this, uri2);
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
mediaPlayer.start();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uri2 = Uri.parse("content://com.android.providers.media.documents/document/audio%3A17207");
uri1 = data.getData();
String str = uri.toString();
}
private void start(){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*");
startActivityForResult(Intent.createChooser(intent, "choose:"), 1);
}
解决方案
我认为你的问题是因为权限。
尝试将 READ_EXTERNAL_STORAGE 添加到清单中。
像这样的东西:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.snazzyapp">
...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
<application ...>
...
</application>
</manifest>
推荐阅读
- acumatica - Save.Press() 和 Actions.PressSave() 有什么区别?
- python - 如何根据枚举数合并两个列表?
- wordpress - 在 register_rest_route 方法中获取当前用户
- python - 如何在使用 Python 进行网络抓取时修复西里尔字符
- angular - 通过组件方法将类插入具有属性绑定的正文元素时出现问题
- javascript - 根据一系列单选按钮对的状态进行计算的好方法是什么?
- lua - 呼叫建立后拨打分机
- powershell - 在将文件复制到文件夹和子文件夹之前避免文件重复
- python - Matplotlib 趋势图
- vue.js - 无法在 laravel 5.8 中加载组件