时间:2016-10-04 07:22:37

标签: android

我正在尝试使用Android Sensor TYPE_PROXIMITY控制声音播放速率。我已经完成编码,一切看起来都不错,但当我尝试在我的Android手机上运行我的代码时显示错误:

  

10-04 00:16:23.711 2024-2024 /? E / AndroidRuntime:致命异常:主要                                                    处理:com.example.leonzhang.clapapp,PID:2024                                                    java.lang.RuntimeException:无法启动活动   ComponentInfo {com.example.leonzhang.clapapp / com.example.leonzhang.clapapp.MainActivity}:   java.lang.NullPointerException:尝试调用虚方法' void   com.example.leonzhang.clapapp.SoundControl.addSound(INT,   java.lang.String中)'在null对象引用上                                                        在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)                                                        在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)                                                        在android.app.ActivityThread.access $ 900(ActivityThread.java:150)                                                        在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344)                                                        在android.os.Handler.dispatchMessage(Handler.java:102)                                                        在android.os.Looper.loop(Looper.java:148)                                                        在android.app.ActivityThread.main(ActivityThread.java:5417)                                                        at java.lang.reflect.Method.invoke(Native Method)                                                        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:764)                                                        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)                                                     引起:java.lang.NullPointerException:尝试调用虚方法' void   com.example.leonzhang.clapapp.SoundControl.addSound(INT,   java.lang.String中)'在null对象引用上                                                        在com.example.leonzhang.clapapp.MainActivity.onCreate(MainActivity.java:36)                                                        在android.app.Activity.performCreate(Activity.java:6285)                                                        在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)                                                        在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)                                                        在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)

                                                 at android.app.ActivityThread.access$900(ActivityThread.java:150) 
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                 at android.os.Looper.loop(Looper.java:148) 
                                                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:764)

                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

我不知道如何为此错误修改我的代码。请给我一些帮助。非常感谢你

更新代码:

Mainactivity.java

public class MainActivity extends Activity implements SensorEventListener,View.OnClickListener {
    private static final float SHAKE_THRESHOLD = 50;
    private static final String TAG = "ActivityTest";
    private SensorManager manager;
    private SoundControl sm;
    private long curTime, lastUpdate;
    private float last_x, last_y, last_z;
    private float x,y,z;
    private boolean isPlaying;
    private int count = -2;
    private float force;
    private int audioCount = 0;
    private float audioForce;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) this.findViewById(R.id.button);
        btn.setOnClickListener(this);
        manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sm = new SoundControl(this);
        sm.addSound(1, "clapping.ogg");
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        curTime = System.currentTimeMillis();
        if ((curTime - lastUpdate) > 100) {
            count ++ ;
            if (count < 0) {
                return;
            }
            if (count == 0) {
                if (!isPlaying) {
                    Log.i(TAG, "sm.play(1, 0, 1.0f);");
                    sm.play(1, 0, 1.0f);
                }
                last_x = event.values[SensorManager.DATA_X];
                last_y = event.values[SensorManager.DATA_Y];
                last_z = event.values[SensorManager.DATA_Z];
                return;
            }
            lastUpdate = curTime;
            x = event.values[SensorManager.DATA_X];
            y = event.values[SensorManager.DATA_Y];
            z = event.values[SensorManager.DATA_Z];
            curTime = System.currentTimeMillis();
            float deltaForce =  Math.abs(x + y + z - last_x - last_y - last_z);
            force = force + deltaForce;
            updateAudioRate(deltaForce);
            if (count >= SHAKE_THRESHOLD) {
                Log.i(TAG, "unSensorListener");
                //                onShakeCallBack(force / count);     get the score
                unSensorListener();
                if (isPlaying) {
                    sm.stop();
                    isPlaying = false;
                }
                count = - 2;
                force = 0;
                return;
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
    }


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    private void updateAudioRate(float force) {
        float rate=0;
        float prvAudioRate = 1;
        audioCount =audioCount+1;
        audioForce=audioForce+force;
        if(audioCount>3){
            //from 0-50 maps to 0.6 to 2
            //rate=audioForce/audioCount*0.03+0.5;
            //from 0-50 maps to 1 to 1.8
            rate=(float) (audioForce/audioCount*0.012+1.0);
            //myAlert(rate);
            prvAudioRate=prvAudioRate+(rate-prvAudioRate)/3;
            sm.setRate(prvAudioRate);
            Log.i(TAG, "sm.setRate=" + prvAudioRate);
            audioForce=0;
            audioCount=0;
            //prvAudioRate=rate;
        }
    }

    private void setSensorListener() {
        Log.i(TAG, "setSensorListener");
        Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
    }

    private void unSensorListener() {
        Log.i(TAG, "unregisterListener");
        manager.unregisterListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                setSensorListener();
                break;
            default:
                break;
        }
    }
}

SoundControl.java

public class SoundControl {
    public SoundPool mSoundPool;
    private HashMap<Integer, Integer> mSoundPoolMap;
    private AudioManager mAudioManager;
    private Context mContext;
    private int mStreamID;
    static final String LOG_TAG = "SoundManager";
    private boolean mSoundEnable = true;
    private float mRate = 1f;
    private boolean playing = false;
    private int loopMode = 0;
    private int mPlayIndex = -1;

    public SoundControl(Context mContext) {
        this.mContext = mContext;
        mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
        mSoundPoolMap = new HashMap<Integer, Integer>();
        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    }


    public void addSound(int index, String audioName) {
        // mSoundPoolMap.put(1, mSoundPool.load(mContext, SoundID, 1));
        try {
            mSoundPoolMap.put(index, mSoundPool.load(mContext.getAssets().openFd(audioName), 1));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // loopMode=0:play once; loopMode=-1:loop mode;
    public void play(int index, int loopMode, float rate) {
        if (mSoundEnable) {
            this.loopMode = loopMode;
            mRate = checkRate(rate);

            int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
            // float streamVolume = 0.1f;
            // notes: for loop mode, the priority should be set to 0, else it can't be stopped
            // mStreamID=mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, loopMode, mRate);
            if (mPlayIndex < 0) {
                mStreamID = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 0, loopMode, mRate);
            } else {
                mStreamID = mSoundPool.play(mSoundPoolMap.get(mPlayIndex), streamVolume, streamVolume, 0, loopMode, mRate);
            }
            playing = true;
        }
    }

    // added for v 1.0.1, enable changing the audio remotely
    public void setPlayIndex(int index) {
        mPlayIndex = index;
    }

    public void setRate(float rate) {
        if (mSoundEnable) {
            mRate = checkRate(rate);
            mSoundPool.setRate(mStreamID, mRate);
        }
    }

    private float checkRate(float rate) {
        if (rate > 2f) {
            return 2f;
        } else if (rate < 0.5f) {
            return 0.5f;
        } else {
            return rate;
        }
    }

    public void stepRate(float step) {
        if (mSoundEnable) {
            mRate = mRate + step;
            mRate = checkRate(mRate);
            mSoundPool.setRate(mStreamID, mRate);
        }
    }

    public void pause() {
        if (mSoundEnable) {
            mSoundPool.pause(mStreamID);
            // mSoundPool.autoPause();
        }
    }

    public void resume() {
        if (mSoundEnable) {
            if (false == playing) {
                play(1, loopMode, mRate);
            } else {
                mSoundPool.resume(mStreamID);
            }
        }
        // mSoundPool.autoResume();
    }

    public void stop() {
        if (mSoundEnable) {
            playing = false;
            mSoundPool.stop(mStreamID);
        }
    }

    public void setSound(boolean soundEnable) {
        mSoundEnable = soundEnable;
    }

    public void release() {
        if (mSoundEnable) {
            playing = false;
            mSoundPool.release();
        }
        mSoundPool.release();
        mSoundPool = null;
        mSoundPoolMap.clear();
        mSoundPoolMap = null;
    }
}

现在我收到了新的错误:

致命的例外:主要                                                  过程:com.example.leonzhang.clapapp,PID:9290                                                  java.lang.NullPointerException:尝试调用虚方法&#39; int java.lang.Integer.intValue()&#39;在null对象引用上                                                      在com.example.leonzhang.clapapp.SoundControl.play(SoundControl.java:58)                                                      在com.example.leonzhang.clapapp.MainActivity.onSensorChanged(MainActivity.java:56)                                                      在android.hardware.SystemSensorManager $ SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:483)                                                      在android.os.MessageQueue.nativePollOnce(本机方法)                                                      在android.os.MessageQueue.next(MessageQueue.java:323)                                                      在android.os.Looper.loop(Looper.java:135)                                                      在android.app.ActivityThread.main(ActivityThread.java:5417)                                                      at java.lang.reflect.Method.invoke(Native Method)                                                      在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:764)                                                      在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

0 个答案:

没有答案