2013-12-17 55 views
0

我有一個服務類,其中定義了我的所有音樂播放/暫停功能。同一類實現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; 
+0

你使用遊標還是任何列表?粘貼你的代碼。 –

+0

是否有任何特殊原因導致它僅在4.3版本中崩潰? – Jeet

+0

** java.lang.ArrayIndexOutOfBoundsException:length = 12;索引= -1 **這個錯誤說你的錯誤..檢查特定行和檢查索引..我不知道版本相關的問題.. :( –

回答

0

你有沒有com.example.proximitybasedmediaplayer.PlayerService.initNotification (PlayerService.java:585)的來源?它嘗試從索引爲-1的ArrayList中獲取數據。 -1是搜索某些東西時找不到的方法返回的值。如果確實有源代碼,找出要搜索的內容,最有可能缺少一個參數。如果你沒有源代碼,你可以通過adb從設備中獲取apk文件,並用jad解碼源文件。解碼的源代碼不會編譯,但會以某種方式可讀。

日誌中的異常並不意味着服務無法啓動。程序員可能更喜歡捕獲異常,而不是檢查索引== 1。而e.printStackTrace()是大多數IDE自動插入到catch塊中的東西。

+0

我有源代碼,我正在查看它,它的songIndex我認爲..謝謝接受,如果它的工作,songIndex是-1 ...所以我可以從這裏調試。再次感謝 – Jeet