我有一個服務類,其中定義了我的所有音樂播放/暫停功能。同一類實現SensorEventListener,當我測試它Android4.3在Android 4.3中啓動服務時發生錯誤
完整的logcat我收到此錯誤:
12-16 23:18:03.194: E/AndroidRuntime(966): java.lang.RuntimeException:
Unable to start service [email protected]
with Intent { cmp=com.example.proximitybasedmediaplayer/.PlayerService (has extras) }:
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
12-17 00:33:40.754: E/AndroidRuntime(1341): FATAL EXCEPTION: main
12-17 00:33:40.754: E/AndroidRuntime(1341): java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=com.example.proximitybasedmediaplayer/.PlayerService (has extras) }: java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2721)
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.app.ActivityThread.access$1900(ActivityThread.java:141)
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.os.Looper.loop(Looper.java:137)
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.app.ActivityThread.main(ActivityThread.java:5103)
12-17 00:33:40.754: E/AndroidRuntime(1341): at java.lang.reflect.Method.invokeNative(Native Method)
12-17 00:33:40.754: E/AndroidRuntime(1341): at java.lang.reflect.Method.invoke(Method.java:525)
12-17 00:33:40.754: E/AndroidRuntime(1341): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-17 00:33:40.754: E/AndroidRuntime(1341): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-17 00:33:40.754: E/AndroidRuntime(1341): at dalvik.system.NativeStart.main(Native Method)
12-17 00:33:40.754: E/AndroidRuntime(1341): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
12-17 00:33:40.754: E/AndroidRuntime(1341): at java.util.ArrayList.get(ArrayList.java:310)
12-17 00:33:40.754: E/AndroidRuntime(1341): at com.example.proximitybasedmediaplayer.PlayerService.initNotification(PlayerService.java:585)
12-17 00:33:40.754: E/AndroidRuntime(1341): at com.example.proximitybasedmediaplayer.PlayerService.onStartCommand(PlayerService.java:177)
12-17 00:33:40.754: E/AndroidRuntime(1341): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2704)
12-17 00:33:40.754: E/AndroidRuntime(1341): ... 10 more
它在4.2或更低版本。
什麼邏輯使它在4.2而不是4.3中工作?有意向傳遞額外信息有沒有變化?
此外,在崩潰後,我看到在服務中編寫的監聽器部分被調用。這意味着什麼,引發錯誤的服務開始了?我無法理解事情如何被調用的流程。 (只在4.3版本中)
對不起,沒有提供任何代碼,因爲它是非常大的文件。
任何幫助表示讚賞。
代碼:
public void playSong(int songIndex) {
// Play song
try {
initUI();
mp.reset();
mp.setDataSource(songsListingSD.get(songIndex).get("songPath"));
mp.prepare();
mp.start();
// Displaying Song title
String songTitle = songsListingSD.get(songIndex).get("songTitle");
if(songTitle != null)
{
songTitleLabel.get().setText(songTitle);
}
// Changing Button Image to pause image
if(btnPlay!=null)
{
btnPlay.get().setImageResource(R.drawable.ic_media_pause);
}
// set Progress bar values
songProgressBar.get().setProgress(0);
songProgressBar.get().setMax(100);
// Updating progress bar
updateProgressBar();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch(Exception e)
{e.printStackTrace();}
}
這種方法獲取調用內部:
SensorEventListener proximityListener = new SensorEventListener(){
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
Log.d("Debug", "Proximity Sensor");
Random rand = new Random();
try{
currentSongIndex = rand.nextInt((songsListingSD.size() - 1) - 0 + 1) + 0;
}
catch(Exception e)
{
e.printStackTrace();
}
try{
playSong(currentSongIndex);
Log.d("Test","Test");
}
catch(Exception e)
{
e.printStackTrace();
}
}};
initUI部分是:
private void initUI() {
try{
songTitleLabel = new WeakReference<TextView>(MainActivity.songTitle);
songCurrentDurationLabel = new WeakReference<TextView>(
MainActivity.songCurrentDurationLabel);
songTotalDurationLabel = new WeakReference<TextView>(
MainActivity.songTotalDurationLabel);
btnPlay = new WeakReference<ImageView>(MainActivity.btnPlay);
if(btnPlay!= null)
{
Log.d("Debug", "btnPlay not null11");
}
btnForward = new WeakReference<ImageView>(MainActivity.btnForward);
btnBackward = new WeakReference<ImageView>(MainActivity.btnBackward);
btnNext = new WeakReference<ImageView>(MainActivity.btnNext);
btnPrevious = new WeakReference<ImageView>(MainActivity.btnPrevious);
btnRepeat = new WeakReference<ImageButton>(MainActivity.btnRepeat);
btnShuffle = new WeakReference<ImageButton>(MainActivity.btnShuffle);
btnPlay.get().setOnClickListener(this);
btnForward.get().setOnClickListener(this);
btnBackward.get().setOnClickListener(this);
btnNext.get().setOnClickListener(this);
btnPrevious.get().setOnClickListener(this);
btnRepeat.get().setOnClickListener(this);
btnShuffle.get().setOnClickListener(this);
// TODO Auto-generated method stub
songProgressBar = new WeakReference<SeekBar>(
MainActivity.songProgressBar);
songProgressBar.get().setOnSeekBarChangeListener(this);
}
catch(Exception e){
Log.d("ERROR","Inside initComp Service Class");
e.printStackTrace();}
}
變量是:
private WeakReference<ImageButton> btnRepeat, btnShuffle;
private WeakReference<ImageView> btnPlay, btnForward, btnBackward, btnNext,
btnPrevious;
private WeakReference<SeekBar> songProgressBar;
private WeakReference<TextView> songTitleLabel;
private WeakReference<TextView> songCurrentDurationLabel;
private WeakReference<TextView> songTotalDurationLabel;
public static MediaPlayer mp;
private Handler progressBarHandler = new Handler();;
private Utilities utils;
private int seekForwardTime = 5000; // 5000 milliseconds
private int seekBackwardTime = 5000; // 5000 milliseconds
private boolean isShuffle = false;
private boolean isRepeat = false;
private ArrayList<HashMap<String, String>> songsListingSD = new ArrayList<HashMap<String, String>>();
private ArrayList<MusicMetadata> songListingRecent = new ArrayList<MusicMetadata>();
public static int currentSongIndex = -1;
你使用遊標還是任何列表?粘貼你的代碼。 –
是否有任何特殊原因導致它僅在4.3版本中崩潰? – Jeet
** java.lang.ArrayIndexOutOfBoundsException:length = 12;索引= -1 **這個錯誤說你的錯誤..檢查特定行和檢查索引..我不知道版本相關的問題.. :( –