2017-02-21 6 views
-1

У меня есть приложение, которое использует класс MediaPlayer для создания звуковых файлов в воспроизводимых файлах, которые Android обрабатывает проще.
Весь неэффективный код объясняется тем, что нам разрешено использовать только те ресурсы, которые были изучены до сих пор.
Прямо сейчас у меня проблема с массивом объектов MediaPlayer.Проблема с массивом объектов MediaPlayer

Нам поручено сделать кнопку, которая заставляет игру Twinkle Twinkle Little Star играть.
В любое время вызывается объект (mpA, mpB и т. Д.), Звук воспроизводится.
Однако всякий раз, когда объект вызывается массивом (mediaFiles [0], mediaFiles [1] и т. Д.), Приложение вылетает из-за NullPointerExeption.

Объект не является нулевым, и я тестировал его несколько раз.
Объект рассматривается как объект MediaPlayer.

И я, и мой учитель понятия не имеем, что может быть причиной этого.

package com.example.mgeyer.synthesizer; 

import android.media.MediaPlayer; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.NumberPicker; 

public class SynthesizerActivity extends AppCompatActivity { 
    private final int WHOLE_NOTE = 1000; 
    private static final String TAG = 
      SynthesizerActivity.class.getName(); 
    private Button mAButton; 
    private Button mASButton; 
    private Button mBButton; 
    private Button mCButton; 
    private Button mCSButton; 
    private Button mDButton; 
    private Button mDSButton; 
    private Button mEButton; 
    private Button mFButton; 
    private Button mFSButton; 
    private Button mGButton; 
    private Button mGSButton; 
    private Button mHEButton; 
    private Button mHFButton; 
    private Button mHFSButton; 
    private Button mHGButton; 
    private MediaPlayer mpA; 
    private MediaPlayer mpAS; 
    private MediaPlayer mpB; 
    private MediaPlayer mpC; 
    private MediaPlayer mpCS; 
    private MediaPlayer mpD; 
    private MediaPlayer mpDS; 
    private MediaPlayer mpE; 
    private MediaPlayer mpF; 
    private MediaPlayer mpFS; 
    private MediaPlayer mpG; 
    private MediaPlayer mpGS; 
    private MediaPlayer mpHE; 
    private MediaPlayer mpHF; 
    private MediaPlayer mpHFS; 
    private MediaPlayer mpHG; 
    private NumberPicker numberPickerNote; 
    private NumberPicker numberPickerAmount; 
    // private int timesPlayed = 1; 
    //private MediaPlayer selectedNote = mpA; 
    private MediaPlayer[] mediaFiles = {mpA, mpAS, mpB, mpC, mpCS, mpD, mpDS, mpE, mpF, mpFS, mpG, mpGS, mpHE, mpHF, mpHFS, mpHG}; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_synthesizer); 
     mAButton = (Button) findViewById(R.id.aButton); 
     mASButton = (Button) findViewById(R.id.asButton); 
     mBButton = (Button) findViewById(R.id.bButton); 
     mCButton = (Button) findViewById(R.id.cButton); 
     mCSButton = (Button) findViewById(R.id.csButton); 
     mDButton = (Button) findViewById(R.id.dButton); 
     mDSButton = (Button) findViewById(R.id.dsButton); 
     mEButton = (Button) findViewById(R.id.eButton); 
     mFButton = (Button) findViewById(R.id.fButton); 
     mFSButton = (Button) findViewById(R.id.fsButton); 
     mGButton = (Button) findViewById(R.id.gButton); 
     mGSButton = (Button) findViewById(R.id.gsButton); 
     mHEButton = (Button) findViewById(R.id.heButton); 
     mHFButton = (Button) findViewById(R.id.hfButton); 
     mHFSButton = (Button) findViewById(R.id.hfsButton); 
     mHGButton = (Button) findViewById(R.id.hgButton); 
     mpA = MediaPlayer.create(this, R.raw.scalea); 
     mpAS = MediaPlayer.create(this, R.raw.scaleas); 
     mpB = MediaPlayer.create(this, R.raw.scaleb); 
     mpC = MediaPlayer.create(this, R.raw.scalec); 
     mpCS = MediaPlayer.create(this, R.raw.scalecs); 
     mpD = MediaPlayer.create(this, R.raw.scaled); 
     mpDS = MediaPlayer.create(this, R.raw.scaleds); 
     mpE = MediaPlayer.create(this, R.raw.scalee); 
     mpF = MediaPlayer.create(this, R.raw.scalef); 
     mpFS = MediaPlayer.create(this, R.raw.scalefs); 
     mpG = MediaPlayer.create(this, R.raw.scaleg); 
     mpGS = MediaPlayer.create(this, R.raw.scalegs); 
     mpHE = MediaPlayer.create(this, R.raw.scalehighe); 
     mpHF = MediaPlayer.create(this, R.raw.scalehighf); 
     mpHFS = MediaPlayer.create(this, R.raw.scalehighfs); 
     mpHG = MediaPlayer.create(this, R.raw.scalehighg); 
     numberPickerNote = (NumberPicker)findViewById(R.id.numberPicker); 
     numberPickerAmount = (NumberPicker)findViewById(R.id.numberPicker2); 
     numberPickerNote.setMinValue(1); 
     numberPickerNote.setMaxValue(16); 
     numberPickerAmount.setMinValue(1); 
     numberPickerAmount.setMaxValue(10); 

     numberPickerNote.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
       //selectedNote = mediaFiles[numberPickerNote.getValue() - 1]; 
      } 
     }); 

     numberPickerAmount.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
       //timesPlayed = numberPickerAmount.getValue(); 
      } 
     }); 
    } 

    private void delayPlaying(int delay) throws InterruptedException { 
     try { 
      Thread.sleep(delay); 
     } catch (InterruptedException e) { 
      Log.e("SynthesizerActivity", "Audio playback interrupted"); 
     } 
    } 

    public void onButtonClick(View v) { 
     mpA.seekTo(0); 
     Log.i(TAG, "A Button clicked"); 
     mpA.start(); 
    } 

    public void onButton2Click(View v) { 
     mpAS.seekTo(0); 
     Log.i(TAG, "A# Button clicked"); 
     mpAS.start(); 
    } 

    public void onButton3Click(View v) { 
     mpB.seekTo(0); 
     Log.i(TAG, "B Button clicked"); 
     mpB.start(); 
    } 

    public void onButton4Click(View v) { 
     mpC.seekTo(0); 
     Log.i(TAG, "C Button clicked"); 
     mpC.start(); 
    } 

    public void onButton5Click(View v) { 
     mpCS.seekTo(0); 
     Log.i(TAG, "C# Button clicked"); 
     mpCS.start(); 
    } 

    public void onButton6Click(View v) { 
     mpD.seekTo(0); 
     Log.i(TAG, "D Button clicked"); 
     mpD.start(); 
    } 

    public void onButton7Click(View v) { 
     mpDS.seekTo(0); 
     Log.i(TAG, "D# Button clicked"); 
     mpDS.start(); 
    } 

    public void onButton8Click(View v) { 
     mpE.seekTo(0); 
     Log.i(TAG, "E Button clicked"); 
     mpE.start(); 
    } 

    public void onButton9Click(View v) { 
     mpF.seekTo(0); 
     Log.i(TAG, "F Button clicked"); 
     mpF.start(); 
    } 

    public void onButton10Click(View v) { 
     mpFS.seekTo(0); 
     Log.i(TAG, "F# Button clicked"); 
     mpFS.start(); 
    } 

    public void onButton11Click(View v) { 
     mpG.seekTo(0); 
     Log.i(TAG, "G Button clicked"); 
     mpG.start(); 
    } 

    public void onButton12Click(View v) { 
     mpGS.seekTo(0); 
     Log.i(TAG, "G# Button clicked"); 
     mpGS.start(); 
    } 

    public void onButton13Click(View v) { 
     mpHE.seekTo(0); 
     Log.i(TAG, "High E Button clicked"); 
     mpHE.start(); 
    } 

    public void onButton14Click(View v) { 
     mpHF.seekTo(0); 
     Log.i(TAG, "High F Button clicked"); 
     mpHF.start(); 
    } 

    public void onButton15Click(View v) { 
     mpHFS.seekTo(0); 
     Log.i(TAG, "High F# Button clicked"); 
     mpHFS.start(); 
    } 

    public void onButton16Click(View v) { 
     mpHG.seekTo(0); 
     Log.i(TAG, "High G Button clicked"); 
     mpHG.start(); 
    } 

    public void onButton17Click(View v) { 
     try { 
      mpE.seekTo(0); 
      mpE.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpFS.seekTo(0); 
      mpFS.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpG.seekTo(0); 
      mpG.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpA.seekTo(0); 
      mpA.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpB.seekTo(0); 
      mpB.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpCS.seekTo(0); 
      mpCS.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpD.seekTo(0); 
      mpD.start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mpHE.seekTo(0); 
      mpHE.start(); 
      delayPlaying(WHOLE_NOTE/2); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void onSelectedNoteClick(View v) { 
     for (int i = numberPickerAmount.getValue(); i > 0; i--) { 
      try { 
       mediaFiles[(numberPickerNote.getValue() - 1)].seekTo(0); 
       mediaFiles[(numberPickerNote.getValue() - 1)].start(); 
       delayPlaying(WHOLE_NOTE/2); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void onTwinkleClick (View v) { 
     try { 
      mediaFiles[0].seekTo(0); 
      mediaFiles[0].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[0].seekTo(0); 
      mediaFiles[0].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[13].seekTo(0); 
      mediaFiles[13].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[13].seekTo(0); 
      mediaFiles[13].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[2].seekTo(0); 
      mediaFiles[2].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[2].seekTo(0); 
      mediaFiles[2].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[0].seekTo(0); 
      mediaFiles[0].start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[2].seekTo(0); 
      mediaFiles[2].start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[2].seekTo(0); 
      mediaFiles[2].start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mediaFiles[0].seekTo(0); 
      mediaFiles[0].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[0].seekTo(0); 
      mediaFiles[0].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[13].seekTo(0); 
      mediaFiles[13].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[13].seekTo(0); 
      mediaFiles[13].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[12].seekTo(0); 
      mediaFiles[12].start(); 
      delayPlaying(WHOLE_NOTE/2); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[5].seekTo(0); 
      mediaFiles[5].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[4].seekTo(0); 
      mediaFiles[4].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[2].seekTo(0); 
      mediaFiles[2].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[2].seekTo(0); 
      mediaFiles[2].start(); 
      delayPlaying(WHOLE_NOTE/4); 
      mediaFiles[0].seekTo(0); 
      mediaFiles[0].start(); 
      delayPlaying(WHOLE_NOTE/2); 
     } catch (InterruptedException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Также представлен вывод отладчика.

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.mgeyer.synthesizer, PID: 4066 
        java.lang.IllegalStateException: Could not execute method for android:onClick 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
         at android.view.View.performClick(View.java:5637) 
         at android.view.View$PerformClick.run(View.java:22429) 
         at android.os.Handler.handleCallback(Handler.java:751) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
        Caused by: java.lang.reflect.InvocationTargetException 
         at java.lang.reflect.Method.invoke(Native Method) 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
         at android.view.View.performClick(View.java:5637) 
         at android.view.View$PerformClick.run(View.java:22429) 
         at android.os.Handler.handleCallback(Handler.java:751) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.seekTo(int)' on a null object reference 
         at com.example.mgeyer.synthesizer.SynthesizerActivity.onTwinkleClick(SynthesizerActivity.java:261) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
         at android.view.View.performClick(View.java:5637) 
         at android.view.View$PerformClick.run(View.java:22429) 
         at android.os.Handler.handleCallback(Handler.java:751) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
+0

Почему вы создаете так много объектов медиаплеера? Предполагается ли приложение одновременно воспроизводить несколько файлов? –

+0

Кроме того, остальная часть кода действительно избыточна, один метод onButtonClick полностью достаточен, потому что вы знаете, из параметра параметра, на который нажата кнопка. –

+0

Подробнее о [mcve]. Ключевое слово минимально. –

ответ

1

Если вы проверите это с помощью более простого примера, вы увидите, что в этом случае значения действительно равны нулю.

например. с

public class Test 
    { 
    Object o1; //reference to null! (default value) 
    Object [] tests = new Object[] {o1}; //..therefore tests contains null 


    public void test() 
    { 
    this.o1=new Object(); //now points to a new object, but tests[0]... 
    System.out.println(this.tests[0]); //...has the null reference 
    System.out.println(this.o1); //prints out reference to object 
    this.tests[0]=this.o1; //now tests[0] points to the same object... 
    System.out.println(this.tests[0]); //...as this.o1 

    } 
    public static void main(String[] args) 
    { 
    new Test().test(); 
    } 
} 

Всегда помните, что вы только положить ссылку (то есть указатель) на объект (или нуль) в массиве. Если атрибут указывает на новый объект (в вашем случае объект MediaPlayer), это будет не изменить исходную ссылку, которая имеет тот же адрес, что и раньше.

Настоящим примером может служить адресная книга, содержащая адрес друга. Если этот друг движется, запись в вашей адресной книге все равно укажет на его/ее старый дом.

Редактировать: вам не нужно много реализаций метода onButtonClick, одного достаточно, так как у вас есть параметр вида, который сообщает вам, на какую кнопку нажали.

1

Объект не является нулевым, и я тестировал его несколько раз. Объект рассматривается как объект MediaPlayer.

Объект null. StackTrace не лежит ...

И я, и мой учитель понятия не имею, что может быть причиной этого

знает ваш учитель Java?

Создание массива ваших полей, которые не инициализированы, определенно сделает их нулевыми!


Вместо этого ...

private MediaPlayer[] mediaFiles = {mpA, mpAS, mpB, mpC, mpCS, mpD, mpDS, mpE, mpF, mpFS, mpG, mpGS, mpHE, mpHF, mpHFS, mpHG}; 

Заменить этот

private MediaPlayer[] mediaFiles; 

И в onCreate, вы можете создать этот массив с непустых ссылок.

// Other players... 
mpHG = MediaPlayer.create(this, R.raw.scalehighg); 
mediaFiles = {mpA, mpAS, mpB, mpC, mpCS, mpD, mpDS, mpE, mpF, mpFS, mpG, mpGS, mpHE, mpHF, mpHFS, mpHG}; 

Или использовать HashMap<Integer, MediaPlayer> как так

private Map<Integer, MediaPlayer> mediaPlayerMap = new HashMap<Integer, MediaPlayer>(); 

... 

// For example 
button.setTag(R.raw.scalehighg); 
mediaPlayerMap.put(R.raw.scalehighg, MediaPlayer.create(this, R.raw.scalehighg)); 

... 

// Any button click... 
@Override 
public void onClick(View v) { 
    Integer songId = (Integer) v.getTag(); 
    MediaPlayer mp = mediaPlayerMap.get(songId); 
    mp.seekTo(0); 
    mp.start(); 
} 

Хотя, реально, я думаю, вам нужно всего лишь один MediaPlayer в зависимости от ваших потребностей.

Смежные вопросы