2012-08-03 128 views
0

我下载了闹钟应用程序,因为我需要了解它是如何工作的。 GNU许可证。Android - 闹钟错误

但我无法运行它。 (?东西)当我点击,我得到这个错误:

 08-03 14:40:26.154: E/AndroidRuntime(255): at com.codeskraps.talarkam.TalarkamActivity.onResume(TalarkamActivity.java:108) 

某些代码:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d(TAG, "onCreate Started"); 

    setContentView(R.layout.alarm_controller); 

    prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    tpAlarm = (TimePicker) findViewById(R.id.tpAlarm); 
    chkSnooze = (CheckBox) findViewById(R.id.chkSnooze); 
    etxtSnoozeMin = (EditText) findViewById(R.id.etxtSnoozeMin); 
    Button button = (Button) findViewById(R.id.btnSetAlarm); 
    btnSetTone = (Button) findViewById(R.id.btnSetTone); 
    chkVolume = (CheckBox) findViewById(R.id.chkVolume); 
    skbVolume = (SeekBar) findViewById(R.id.skbVolume); 

    button.setOnClickListener(setAlarmListener); 
    btnSetTone.setOnClickListener(this); 
} 


protected void onResume() { 
    Log.d(TAG, "onResume"); 
    super.onResume(); 

    tpAlarm.setCurrentHour(prefs.getInt(M_HOUR, 0)); 
    tpAlarm.setCurrentMinute(prefs.getInt(M_MINT, 0)); 
    chkSnooze.setChecked(prefs.getBoolean(M_SNOOZE, false)); 
    etxtSnoozeMin.setText(prefs.getString(SNOOZE_T, "0")); 
    chkVolume.setChecked(prefs.getBoolean(CHKVOLUME, false)); 
    skbVolume.setProgress(prefs.getInt(SKBVOLUME, 0)); 

    Uri alarmUri = Uri.parse(prefs.getString(TONE, null)); 
    Ringtone ringtone = RingtoneManager.getRingtone(this, alarmUri); 
    if (ringtone != null) { 
     String name = ringtone.getTitle(this); 
     btnSetTone.setText(name); 
    } else 
     btnSetTone.setText(getString(R.string.btn_SetAlarmTone)); 

    if (prefs.getBoolean(FIRST_LAUNCH, true)) { 
     Intent checkIntent = new Intent(); 
     checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 

     SharedPreferences.Editor editor = prefs.edit(); 

     editor.putBoolean(FIRST_LAUNCH, false); 
     editor.commit(); 
    } 
} 


protected void onPause() { 
    Log.d(TAG, "onPause"); 
    super.onPause(); 

    SharedPreferences.Editor editor = prefs.edit(); 

    editor.putInt(M_HOUR, tpAlarm.getCurrentHour()); 
    editor.putInt(M_MINT, tpAlarm.getCurrentMinute()); 
    editor.putBoolean(M_SNOOZE, chkSnooze.isChecked()); 
    editor.putString(SNOOZE_T, etxtSnoozeMin.getText().toString()); 
    editor.putBoolean(CHKVOLUME, chkVolume.isChecked()); 
    editor.putInt(SKBVOLUME, skbVolume.getProgress()); 

    editor.commit(); 
} 

的logcat:

08-03 14:40:25.684: D/TalarkamActivity(255): onCreate Started 
08-03 14:40:25.965: D/dalvikvm(255): GC freed 599 objects/51056 bytes in 86ms 
08-03 14:40:26.134: D/TalarkamActivity(255): onResume 
08-03 14:40:26.144: D/AndroidRuntime(255): Shutting down VM 
08-03 14:40:26.144: W/dalvikvm(255): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
08-03 14:40:26.144: E/AndroidRuntime(255): Uncaught handler: thread main exiting due to uncaught exception 
08-03 14:40:26.154: E/AndroidRuntime(255): java.lang.RuntimeException: Unable to resume activity {com.codeskraps.talarkam/com.codeskraps.talarkam.TalarkamActivity}: java.lang.NullPointerException: uriString 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2965) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2516) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.os.Looper.loop(Looper.java:123) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread.main(ActivityThread.java:4363) 
08-03 14:40:26.154: E/AndroidRuntime(255): at java.lang.reflect.Method.invokeNative(Native Method) 
08-03 14:40:26.154: E/AndroidRuntime(255): at java.lang.reflect.Method.invoke(Method.java:521) 
08-03 14:40:26.154: E/AndroidRuntime(255): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-03 14:40:26.154: E/AndroidRuntime(255): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-03 14:40:26.154: E/AndroidRuntime(255): at dalvik.system.NativeStart.main(Native Method) 
08-03 14:40:26.154: E/AndroidRuntime(255): Caused by: java.lang.NullPointerException: uriString 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.net.Uri$StringUri.<init>(Uri.java:420) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.net.Uri$StringUri.<init>(Uri.java:410) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.net.Uri.parse(Uri.java:382) 
08-03 14:40:26.154: E/AndroidRuntime(255): at com.codeskraps.talarkam.TalarkamActivity.onResume(TalarkamActivity.java:108) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.Activity.performResume(Activity.java:3763) 
08-03 14:40:26.154: E/AndroidRuntime(255): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2937) 
+0

哪一条是108行? – 0gravity 2012-08-03 14:54:00

+0

108 = \t \t Log.d(TAG,“onPause”); – Silesia 2012-08-03 15:07:41

+0

我编辑了你的文章。问题不在于它不会编译。显然它编译得很好。问题是它不会运行。 – 2012-08-03 15:14:34

回答

0

错误是在这里onResume()

Uri alarmUri = Uri.parse(prefs.getString(TONE, null)); 

如果此首选项没有存在,它默认为null,这会导致NullPointerException。

编辑添加的代码建议,在您的onResume()摆脱NPE

替换此代码:

Uri alarmUri = Uri.parse(prefs.getString(TONE, null)); 
Ringtone ringtone = RingtoneManager.getRingtone(this, alarmUri); 
if (ringtone != null) { 
    String name = ringtone.getTitle(this); 
    btnSetTone.setText(name); 
} else 
    btnSetTone.setText(getString(R.string.btn_SetAlarmTone)); 

与此代码:

Ringtone ringtone = null; 
String toneString = prefs.getString(TONE, null); 
if (toneString != null) { 
    Uri alarmUri = Uri.parse(toneString); 
    ringtone = RingtoneManager.getRingtone(this, alarmUri); 
} 
if (ringtone != null) { 
    String name = ringtone.getTitle(this); 
    btnSetTone.setText(name); 
} else { 
    btnSetTone.setText(getString(R.string.btn_SetAlarmTone)); 
} 
+0

嗯,如何解决这个问题? – Silesia 2012-08-03 15:10:25

+0

我不知道应用程序。它看起来应该有一些东西存储在共享首选项中,用'TONE'键,但是没有任何东西存在。请查看您在共享首选项中设置该值的代码,并查看是否正在执行该值。 – 2012-08-03 15:11:53

+0

代码这个活动:http://pastebin.com/D66zUrYB – Silesia 2012-08-03 15:13:03

0

因为我们还没有发布整个代码,找出它失败的线路很困难(第108行)。但我的猜测是,以下行是根本原因:

Uri alarmUri = Uri.parse(prefs.getString(TONE,null));

它无法在首选项中找到TONE键/对象,并将缺省值设置为空。

+0

Full code此活动 http://pastebin.com/D66zUrYB – Silesia 2012-08-03 15:12:16

+0

private static final String TONE =“tone”; – Silesia 2012-08-03 15:14:21