【问题标题】:Alarm dialog with sound带声音的警报对话框
【发布时间】:2015-03-07 21:06:53
【问题描述】:

当倒数计时器结束时,我会弹出一个警报对话框。它工作正常,但是当我尝试在对话框中实现声音时,它不起作用。当我从铃声列表中加载用户在应用程序中的其他位置选择的警报(使用共享首选项编号)时,我收到了 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

LogCat from error,当我只插入 0 而不是在 sharedPrefs 中选择的数字时。

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

【问题讨论】:

  • 你的 logcat 说你在哪里得到 NullPointerException?也许你可以发布 logcat?
  • 你去@ethan123
  • 很酷,所以你的 logcat 说它在第一种情况下发生在第 31 行,在第二种情况下发生在第 41 行。这对应于您上面的代码中的哪一行?
  • 我认为我在文本中解释得很好,但现在添加了。

标签: java android


【解决方案1】:

在第 31 行,您还没有实例化上下文,因此它为空。试试:

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

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

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

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

【讨论】:

  • 您仍然在第 41 行收到 nullpointerexception 吗?还是现在是另一个错误?
  • 添加到第 41 行的答案
  • 非常感谢,我现在正在玩闹铃;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多