2016-09-05 4 views
0

Ich weiß, das ist eine sehr häufige Frage. Jedoch habe ich Probleme, den Ton in meiner Anwendung zu spielen, indem ich MediaPlayer Klasse trotz meiner Logik richtig verwende. Momentan habe ich in meiner Anwendung Funktionen zur Erkennung von Verwacklungen. Jedes Mal, wenn das Gerät geschüttelt wird, sollte es einen Ton wiedergeben. Unten ist mein Code:Android MediaPlayer :: Probleme

public class MainActivity extends AppCompatActivity { 

private SensorManager mSensorManager; 
private Sensor mAccelerometer; 
private ShakeDetector mShakeDetector; 
private SoundManager mSoundManager; 
private TextView xText; 
private Context context; 
private AudioPool ap; 
int id1,id2; 
File directory; 

MediaPlayer player, mPlayer; 
AudioCollective ac; 
Lagu la; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    xText = (TextView)findViewById(R.id.xText); 

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mShakeDetector = new ShakeDetector(); 

    la = new Lagu(); 
    la.initLagu(MainActivity.this); 

    mShakeDetector.setOnShakeListener(new ShakeDetector.OnShakeListener() { 

     @Override 
     public void onShake(int count) { 

      la.playLagu(); 
      xText.setText("Shake:"+count); 

     } 
    }); 
} 

public class Lagu { 
MediaPlayer mPlayer; 
public Lagu(){ 
    mPlayer = new MediaPlayer(); 
} 
public void initLagu(Context theContext){ 
    mPlayer.create(theContext, R.raw.na); 
} 
public void playLagu(){ 
    mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 
} 

}

Das Problem ist die Anwendung NICHT das Telefon geschüttelt wird der Ton jedes Mal spielen. Nicht einmal einmal wird die Anwendung den Ton abspielen. FYI, das Format des Songs ist MP3. Jemand hier bitte sagen Sie mir, was mit meiner Bewerbung falsch läuft? Ihre Hilfe wird geschätzt!

+0

Überprüfen Sie das Protokoll für Warnungen oder Fehler, manchmal diese Klassen können sich von Gerät zu Gerät unterschiedlich verhalten. – Pievis

+0

Hallo, es werden keine Fehler oder Warnungen im Log angezeigt. Es bedeutet, dass die Logik korrekt ist. Aber ich weiß immer noch nicht, warum es den Ton nicht spielt. – JackPowell

Antwort

1

Von documentation für Mediaplayer.create():

Convenience-Methode einen Mediaplayer für eine bestimmte Ressource-ID zu erstellen. Bei Erfolg wurde prepare() bereits aufgerufen und darf nicht erneut aufgerufen werden.

Hinweis: Die Methode Mediaplayer.create() ist eine statische Methode, die Mediaplayer eine ready-to-use zurückgibt.

So müssen Sie den Rückgabewert zu Ihrem mPlayer zuweisen Sie keine OnPreparedListener benötigen - rufen Sie einfach start()

public class Lagu { 

MediaPlayer mPlayer; 

public Lagu(){ 
    // do nothing or call initLagu() here 
    // in this case skip the method call from the Activity's onCreate() 
} 

public void initLagu(Context theContext){ 
    mPlayer = Mediaplayer.create(theContext, R.raw.na); 
} 

public void playLagu(){ 

    mPlayer.start(); 
} 

}

+0

Hallo, vielen Dank für Ihre Antwort. Ich hatte einige Zweifel bezüglich Ihrer Antwort. Soll ich OnPreparedListener bei initLagu() implementieren? und create() bei playLagu()? – JackPowell

+0

@Jack Powell - danke für die Nachfrage. Bitte werfen Sie einen Blick auf meine bearbeitete Antwort - ich habe übersehen, dass Mediaplayer.create() eine statische Methode ist. Mein schlechtes :( – 0X0nosugar

+0

löste das Problem. Danke! – JackPowell