gpt4 book ai didi

java - 带声音的警报对话框

转载 作者:行者123 更新时间:2023-12-01 11:49:09 25 4
gpt4 key购买 nike

当倒计时器完成时,我会弹出一个警报对话框。它工作正常,但是当我尝试在对话框中实现声音时,它不起作用。当我加载用户从铃声列表中选择的应用程序中其他位置的闹钟(带有共享首选项号码)时,我收到 NullPointerException。如果我只是输入一个数字而不使用 SharedPreferences,那么当我将数据源设置为 MediaPlayer 时,我会收到 NullPointerException。这是我的代码:

public class AlarmDialog extends DialogFragment {

MediaPlayer mp;
Context context;
Uri alarmSound;
int alarmChosen;
SharedPreferences sharedPrefs;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

LINE 31 sharedPrefs = context.getSharedPreferences("AlarmChosen", Context.MODE_PRIVATE);
alarmChosen = sharedPrefs.getInt("AlarmChosen", 1);
RingtoneManager ringtoneMgr = new RingtoneManager(context);
ringtoneMgr.setType(RingtoneManager.TYPE_ALL);
alarmSound = ringtoneMgr.getRingtoneUri(alarmChosen);

mp = new MediaPlayer();
mp.reset();
try {
LINE 41 mp.setDataSource(alarmSound.toString());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mp.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mp.start();

getActivity().getWindow().addFlags(
LayoutParams.FLAG_TURN_SCREEN_ON
| LayoutParams.FLAG_DISMISS_KEYGUARD);

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Alarm");
builder.setMessage("An Alarm by AlarmManager");

builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mp.stop();
mp.release();
getActivity().finish();
}
});

return builder.create();
}
}

如何解决这个问题?

编辑:来自sharedPrefs 的LogCat 错误:

03-07 22:22:46.589: E/AndroidRuntime(28062): FATAL EXCEPTION: main
03-07 22:22:46.589: E/AndroidRuntime(28062): Process: com.adrissa.kitchentimer, PID: 28062
03-07 22:22:46.589: E/AndroidRuntime(28062): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adrissa.kitchentimer/com.adrissa.kitchentimer.DemoActivity}: java.lang.NullPointerException
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2394)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2452)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.ActivityThread.access$900(ActivityThread.java:172)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.os.Handler.dispatchMessage(Handler.java:102)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.os.Looper.loop(Looper.java:136)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.ActivityThread.main(ActivityThread.java:5586)
03-07 22:22:46.589: E/AndroidRuntime(28062): at java.lang.reflect.Method.invokeNative(Native Method)
03-07 22:22:46.589: E/AndroidRuntime(28062): at java.lang.reflect.Method.invoke(Method.java:515)
03-07 22:22:46.589: E/AndroidRuntime(28062): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
03-07 22:22:46.589: E/AndroidRuntime(28062): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
03-07 22:22:46.589: E/AndroidRuntime(28062): at dalvik.system.NativeStart.main(Native Method)
03-07 22:22:46.589: E/AndroidRuntime(28062): Caused by: java.lang.NullPointerException
03-07 22:22:46.589: E/AndroidRuntime(28062): at com.adrissa.kitchentimer.AlarmDialog.onCreateDialog(AlarmDialog.java:31)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1177)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.Activity.performStart(Activity.java:5461)
03-07 22:22:46.589: E/AndroidRuntime(28062): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2367)
03-07 22:22:46.589: E/AndroidRuntime(28062): ... 11 more

当我只插入 0 而不是在共享首选项中选择的数字时,出现错误 LogCat。

03-07 22:31:30.979: E/AndroidRuntime(30527): FATAL EXCEPTION: main
03-07 22:31:30.979: E/AndroidRuntime(30527): Process: com.adrissa.kitchentimer, PID: 30527
03-07 22:31:30.979: E/AndroidRuntime(30527): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adrissa.kitchentimer/com.adrissa.kitchentimer.DemoActivity}: java.lang.NullPointerException
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2394)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2452)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.ActivityThread.access$900(ActivityThread.java:172)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.os.Handler.dispatchMessage(Handler.java:102)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.os.Looper.loop(Looper.java:136)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.ActivityThread.main(ActivityThread.java:5586)
03-07 22:31:30.979: E/AndroidRuntime(30527): at java.lang.reflect.Method.invokeNative(Native Method)
03-07 22:31:30.979: E/AndroidRuntime(30527): at java.lang.reflect.Method.invoke(Method.java:515)
03-07 22:31:30.979: E/AndroidRuntime(30527): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
03-07 22:31:30.979: E/AndroidRuntime(30527): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
03-07 22:31:30.979: E/AndroidRuntime(30527): at dalvik.system.NativeStart.main(Native Method)
03-07 22:31:30.979: E/AndroidRuntime(30527): Caused by: java.lang.NullPointerException
03-07 22:31:30.979: E/AndroidRuntime(30527): at com.adrissa.kitchentimer.AlarmDialog.onCreateDialog(AlarmDialog.java:41)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1177)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.Activity.performStart(Activity.java:5461)
03-07 22:31:30.979: E/AndroidRuntime(30527): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2367)
03-07 22:31:30.979: E/AndroidRuntime(30527): ... 11 more

最佳答案

在第 31 行,您尚未实例化上下文,因此它为空。尝试:

sharedPrefs = getActivity().getSharedPreferences("AlarmChosen", Context.MODE_PRIVATE);

添加:对于第 41 行的错误,我建议使用更紧凑的模式来实现您想要做的事情。尝试:

alarmSound = ringtoneMgr.getRingtoneUri(alarmChosen);   
Ringtone r = RingtoneManager.getRingtone(getActivity(), alarmSound);
r.play();

如果您想做的只是播放所选铃声的声音,那么这可能是您最好的选择,并且不会给您带来任何错误,除非您从 getRingtoneUri 检索的 Uri 为 null,这意味着AlarmChosen 不是此方法的有效参数...

关于java - 带声音的警报对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28919998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com