2013-10-05 72 views
0

當應用程序方向更改時,此應用程序崩潰,特別是在該狀態下,我可以給變量返回值。但在我的情況下,我只想清空變量mp。當我添加mp.reset()時,當我旋轉手機時,該應用程序開始崩潰。當應用程序方向發生變化時,Android應用程序崩潰

package com.phone.sensor; 

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.Menu; 
import android.widget.TextView; 

public class sensorActivity extends Activity implements SensorEventListener{ 
    public boolean musStatus = false; 
    public boolean musDeclare = false; 
    public MediaPlayer mp; 

    Sensor accelerometer; 
    SensorManager sm; 
    TextView acceleration; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState==null) 
     { 
      musDeclare = false; 
      musStatus = false; 
      mp = null; 
     } 
     else 
     { 
      mp.reset(); 
     } 

     setContentView(R.layout.activity_main); 
     sm=(SensorManager) getSystemService(SENSOR_SERVICE); 
     accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

     acceleration=(TextView)findViewById(R.id.acceleration); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean("musStatus", musStatus); 
     outState.putBoolean("musDeclare", musDeclare); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 
     acceleration.setText("X: "+event.values[0]+ 
       "\nY: "+event.values[1]+ 
       "\nZ: "+event.values[2]); 

     float x = event.values[0]; 
     float y = event.values[1]; 
     float z = event.values[2]; 

     if(musDeclare == false) 
     { 
      mp = MediaPlayer.create(this, R.raw.alexander); 
      musDeclare = true; 
     } 

     if(y > 8.9) {   
      if(musStatus == false) 
      { 
       mp.start(); 
       musStatus = true; 
      } 
     } 

     if(y < 5) 
     { 
      if(musStatus == true) 
      { 
       mp.stop(); 
       musStatus = false; 

       if(musDeclare == true) 
       { 
        mp = MediaPlayer.create(this, R.raw.alexander); 
        musDeclare = false; 
       } 
      } 
     } 
    } 
} 

logcat的

10-06 01:30:37.105: E/AndroidRuntime(15258): FATAL EXCEPTION: main 
10-06 01:30:37.105: E/AndroidRuntime(15258): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.phone.sensor/com.phone.sensor.sensorActivity}: java.lang.NullPointerException 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2521) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4260) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread.access$700(ActivityThread.java:162) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.os.Looper.loop(Looper.java:158) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread.main(ActivityThread.java:5777) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at java.lang.reflect.Method.invokeNative(Native Method) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at java.lang.reflect.Method.invoke(Method.java:511) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at dalvik.system.NativeStart.main(Native Method) 
10-06 01:30:37.105: E/AndroidRuntime(15258): Caused by: java.lang.NullPointerException 
10-06 01:30:37.105: E/AndroidRuntime(15258): at com.phone.sensor.sensorActivity.onCreate(sensorActivity.java:33) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.Activity.performCreate(Activity.java:5165) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1103) 
10-06 01:30:37.105: E/AndroidRuntime(15258): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
10-06 01:30:37.105: E/AndroidRuntime(15258): ... 12 more 
+0

每次活動都會改變方向,它會重新加載視圖。在播放和改變方向時,您的應用崩潰了嗎? – Si8

+0

在我的應用程序中,當我有手機畫像時音樂播放良好,當我旋轉手機以播放音樂停止和應用程序崩潰時。 @ SiKni8 –

+0

發佈您的logcat的錯誤。 – Szymon

回答

0

林沒有大師,但它荒原像您可以保存mp在:

@Override 
public Object onRetainCustomNonConfigurationInstance() { 
    return this.mp; 
} 

onCreate()你會得到它回來像他

mp = (MediaPlayer) getLastCustomNonConfigurationInstance(); 

檢查這個out因爲試圖保持在ActivityMediaPlayer alive周圍是有問題的

0

嘗試使用下列功能重置您的音樂播放器:

private MediaPlayer mpSound; 
    private void stopPlaying() { 
     if (mpSound != null) { 
      mpSound.stop(); 
      mpSound.release(); 
      mpSound = null; 
     } 
    } 

通話,每次確保聲音設置爲null併發布,所以下次播放時,你的應用不會崩潰(在這種情況下,當它改變方向)

我有類似的問題,我的應用程序和上述代碼修復它。

+0

這個解決方案幫助我保持應用程序的活力,這非常棒,但現在的問題是聲音在同一時間複製和播放。這意味着mp是nu重新初始化@ sikni8 –

+0

由於Logcat表明重新啓動該活動會導致您播放聲音的錯誤。 – Si8