1

私は次のような活動をしています、

public class TestActivity extends Activity {

    private SensorManager      mSensorManager;
        private ShakeEventListener mSensorListener;
    private MediaPlayer        mPlayer;

    private boolean            mIsPlaying; 

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); 

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.testsound);

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensorListener = new ShakeEventListener();   
        mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {

          @Override 
          public void onShake() {
            toggleSound();
          }
        });  
    }

    @Override
    protected void onResume() {
      super.onResume();
      mSensorManager.registerListener(mSensorListener,
          mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
          SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
      super.onPause();
      mSensorManager.unregisterListener(mSensorListener);
      stopSound();
    }    

    protected void toggleSound() {
        if (!mIsPlaying) {
          startSound();
        } else {
          stopSound();  
        }
    }


    protected void startSound() {

        if (mPlayer == null)
          {
            mPlayer = MediaPlayer.create(TestActivity.this, R.raw.test);
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

            mPlayer.setLooping(true);
            mPlayer.start();  

            mPlayer.setOnCompletionListener(new OnCompletionListener() {

                 @Override
                public void onCompletion(MediaPlayer mp) {
                  stopSound();
                }
            }); 

            mIsPlaying = true;
          }
    }


    protected void stopSound() {
        if (mPlayer != null) {
              if (mPlayer.isPlaying())
              {
                  mPlayer.stop();
              }
              mPlayer.release();
              mPlayer = null;
        }

        mIsPlaying = false;
    }

}

これが最善の方法ではないことはわかっていますが、ランダムなテストを始めたところです。ShakeEventListener は含めていませんが、これはシェイク イベントを検出するだけで、次のシェイクまでサンプル サウンドがループ再生されます (はい、かなり面倒です!)。

これは実際には非常にうまく機能しますが、開始コマンドと停止コマンドが実行されたときにstart() mUri is nullorというタグ MediaPlayer を持つ LogCat エントリを取得します。stop() mUri is nullこれは私が何か間違ったことをしたと信じ込ませますが、それが何であるかを知ることはできません。また、これはどうやら一般的なエラーではありません。

ここでそれが何を意味するのか、誰にも分かりますか?私が太っていたらごめんなさい - それはまだ私にとって少し混乱しています.

更新(コメントから):私がしたことの1つは、実際のUri(パスから構築された)を与えることでした。その後、同様の警告が表示され、 start() mUri is android.resource://com.joris.soundtest/2130968576(レベルD)と表示され、今回はEレベルが先行しますUri is android.resource//...(ドットは同じものを与えます)うり)。これらの LogCat エントリは、デバッグのために単に「情報」である可能性はありますか? Eレベルのものはそのように聞こえません..

ありがとう!-ヨリス。

4

1 に答える 1

0

mediaplayer.release() メソッドは mediaplayer オブジェクトを null にしないため、次のことを変更します ...

package com.pranav.listviewdemo;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

public class MainActivity extends Activity {

    private SensorManager      mSensorManager;
    private ShakeEventListener mSensorListener;
    private MediaPlayer        mPlayer;
    static int i=1;

    private boolean            mIsPlaying=false; 

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); 

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_main);

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensorListener = new ShakeEventListener(this,null);   
        mPlayer = MediaPlayer.create(this, R.raw.test);
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

        mPlayer.setLooping(true);

        mPlayer.setOnCompletionListener(new OnCompletionListener() {

             @Override
            public void onCompletion(MediaPlayer mp) {
              stopSound();
            }
        }); 
        mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {

          @Override 
          public void onShake() {
            toggleSound();
            Toast.makeText(getBaseContext(), "DETECTED"+i, Toast.LENGTH_SHORT).show();
            i++;
          }
        });  
    }

    @Override
    protected void onResume() {
      super.onResume();
      mSensorManager.registerListener(mSensorListener,
          mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
          SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
      super.onPause();
      mSensorManager.unregisterListener(mSensorListener);
      stopSound();
    }    

    protected void toggleSound() {
        if (!mIsPlaying) {
          startSound();
        } else {
          stopSound();  
        }
    }


    protected void startSound() {

        if (mPlayer != null)
          {
            mPlayer.seekTo(0);
            mPlayer.start();  
            mIsPlaying = true;
          }
    }


    protected void stopSound() {
        if (mPlayer != null) {
              if (mPlayer.isPlaying())
              {
                  mPlayer.pause();
                  mIsPlaying = false;
              }

        }


    }

}
于 2013-05-01T08:18:23.083 に答える