第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

Audio整合后測試出錯,希望hyman老師和同學(xué)們看下

在audio整合章節(jié)的測試,log拋出一個異常,

異常1
E/InputEventReceiver(17950):?Exception?dispatching?input?event.
?E/MessageQueue-JNI(17950):?Exception?in?MessageQueue?callback:?handleReceiveCallback
?java.lang.NullPointerException
?at?com.imoc_recorder.view.AudioManager.release(AudioManager.java:98)
?at?com.imoc_recorder.view.AudioManager.cancel(AudioManager.java:103)
?at?com.imoc_recorder.view.AudioRecorderButton.onTouchEvent(AudioRecorderButton.java:154)
?異常2
/AndroidRuntime(17950):?FATAL?EXCEPTION:?main
?E/AndroidRuntime(17950):?java.lang.NullPointerException
at?com.imoc_recorder.view.AudioManager.release(AudioManager.java:98)
?at?com.imoc_recorder.view.AudioManager.cancel(AudioManager.java:103)
?at?com.imoc_recorder.view.AudioRecorderButton.onTouchEvent(AudioRecorderButton.java:154)
?兩個異常都是在同一個地方出錯
?AudioRecorderButton.java->onTouchEvent(MotionEvent?event)->if?(!isRecording||mTime<0.6f)?
?->mAudioManager.cancel();->release();->mMediaRecorder.stop();
我上網(wǎng)查了下沒發(fā)現(xiàn)什么錯誤,希望老師和同學(xué)們指點,為什么會錯,跟老師的代碼一樣阿
其實我是長按,不知道為什么會進到這里

public?boolean?onTouchEvent(MotionEvent?event)?{
????????int?action?=?event.getAction();
????????int?x?=?(int)?event.getX();
????????int?y?=?(int)?event.getY();
????????
//????????try?{
????????????switch?(action)?{
????????????case?MotionEvent.ACTION_DOWN:
????????????????changeState(STATE_RECORDING);
????????????????break;

????????????case?MotionEvent.ACTION_MOVE:
????????????????if?(isRecording)?{
????????????????????if?(wantToCancel(x,y))?{
????????????????????????changeState(STATE_WANT_TO_CANCEL);
????????????????????}else?{
????????????????????????changeState(STATE_RECORDING);
????????????????????}
????????????????}
????????????????break;
????????????case?MotionEvent.ACTION_UP:
????????????????if?(!mReady)?{
????????????????????reset();
????????????????????return?super.onTouchEvent(event);
????????????????}
????????????????if?(!isRecording||mTime<0.6f)?{//時間短,還沒有來得及repared
????????????????????mDailogManager.tooShort();
????????????????????mAudioManager.cancel();
????????????????????mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS,?1300);//1.3秒后關(guān)閉tooshort
????????????????}else????if?(mCurState==STATE_RECORDING)?{//正常錄制結(jié)束
????????????????????//release
????????????????????mDailogManager.dimissDialog();
????????????????????mAudioManager.release();
????????????????????//callbackToAct
????????????????????if?(mListener?!=?null)?{
????????????????????????mListener.onFinish(mTime,?mAudioManager.getCurrentFilePath());
????????????????????}
????????????????}else?if?(mCurState==STATE_WANT_TO_CANCEL)?{?
????????????????????//cancel
????????????????????mDailogManager.dimissDialog();
????????????????????mAudioManager.cancel();
????????????????}
????????????????reset();
????????????????break;
????????????????
????????????????
???????public?void?release()?{
????????????mMediaRecorder.stop();
????????????mMediaRecorder.release();
????????????mMediaRecorder?=?null;
????????}
????????public?void?cancel()?{
????????????release();
????????????if?(mCurrentFilePath?!=?null)?{
????????????????File?file?=?new?File(mCurrentFilePath);
????????????????file.delete();
????????????????mCurrentFilePath?=?null;
????????}
????}


正在回答

5 回答

我看你是在release()方法里面拋出的空指針,錯誤行應(yīng)該就一個對象mMediaRecorder吧,你看看你是不是cancel還是某個方法里面誤把mMediaRecorder置null了。



0 回復(fù) 有任何疑惑可以回復(fù)我~

不給源碼不知道什么心態(tài)。這么長時間的視頻讓我們開著視頻對代碼找錯我真是醉了。

0 回復(fù) 有任何疑惑可以回復(fù)我~

同樣的問題。不知道怎么回事。

0 回復(fù) 有任何疑惑可以回復(fù)我~
mport?com.example.imoc_recorder.R;
import?com.imoc_recorder.view.AudioManager.AudioStateListener;

import?android.R.integer;
import?android.content.Context;
import?android.os.Environment;
import?android.os.Handler;
import?android.util.AttributeSet;
import?android.util.Log;
import?android.view.MotionEvent;
import?android.view.View;
import?android.widget.Button;

public?class?AudioRecorderButton?extends?Button?implements?AudioStateListener?{
????
????private?final?int?DISTANCE_Y_CANCEL?=?50;?//y方向的移動距離
????private?static?final?int?STATE_NORNMAL?=1;
????private?static?final?int?STATE_RECORDING?=2;
????private?static?final?int?STATE_WANT_TO_CANCEL?=3;
????
????private?int?mCurState?=?STATE_NORNMAL;
????private?boolean?isRecording=false;?//已經(jīng)開始錄音
????
????private?DailogManager?mDailogManager;
????
????private?AudioManager?mAudioManager;
????
????private?float?mTime=0;
????//是否觸發(fā)longclick
????private?boolean?mReady;
????
????public?AudioRecorderButton(Context?context)?{
????????this(context,null);
????}
????public?AudioRecorderButton(Context?context,?AttributeSet?attrs)?{
????????super(context,?attrs);
????????
????????mDailogManager?=?new?DailogManager(getContext());
????????setOnLongClickListener(new?OnLongClickListener()?{
????????????
????????????@Override
????????????public?boolean?onLongClick(View?v)?{
????????????????mReady?=?true;
????????????????mAudioManager.prepareAudio();
????????????????return?false;
????????????}
????????});
????????
????????String?dir?=?Environment.getExternalStorageDirectory()+"/imooc_recorder_audios";
????????mAudioManager?=?AudioManager.getInstance(dir);
????????mAudioManager.setOnAudioStateListener(this);?//注冊回調(diào)
????????????????
????????????}
????
????//錄音完成后的回調(diào)
????public?interface?AudioFinishRecorderListener?{
????????void?onFinished(float?seconds,String?filePath);
????}
????
????private?AudioFinishRecorderListener?mListener;
????
????public?void?setAudioFinishRecorderListener(AudioFinishRecorderListener?listener)?{
????????mListener?=?listener;
????}
????
????@Override
????public?void?wellPrepared()?{
????????mHandler.sendEmptyMessage(MSG_AUDIO_PREPARED);
????}
????/*
?????*?獲取音量大小
?????*/
????private?Runnable?mGetVoiceLevelRunnable=new?Runnable()?{
????????
????????@Override
????????public?void?run()?{
????????????while?(isRecording)?{
????????????????
????????????????????try?{
????????????????????????Thread.sleep(100);
????????????????????????mTime+=0.1f;
????????????????????????mHandler.sendEmptyMessage(MSG_VOICE_CHANGE);
????????????????????}?catch?(InterruptedException?e)?{
????????????????????????//?TODO?Auto-generated?catch?block
????????????????????????e.printStackTrace();
????????????????????}
????????????????????
????????????????
????????????}
????????}
????};
????
????private?static?final?int?MSG_AUDIO_PREPARED?=?0X110;
????private?static?final?int?MSG_VOICE_CHANGE?=?0X111;
????private?static?final?int?MSG_DIALOG_DIMISS?=?0X112;
????
????private??Handler?mHandler?=?new?Handler()
????{
????????

????????public?void?handleMessage(android.os.Message?msg)?{
????????????switch?(msg.what)?{
????????????case?MSG_AUDIO_PREPARED:
????????????????//?正真顯示dialog在audio?end?prepared以后
????????????????mDailogManager.showRecordingDialog();
????????????????isRecording?=?true;
????????????????//開啟線程獲取音量
????????????????new?Thread(mGetVoiceLevelRunnable).start();
????????????????break;
????????????case?MSG_VOICE_CHANGE:
????????????????mDailogManager.updateVoiceLevel(mAudioManager.getVoiceLevel(7));
????????????????break;
????????????case?MSG_DIALOG_DIMISS:
????????????????mDailogManager.dimissDialog();
????????????????break;
????????????}
????????};
????};
????@Override
????public?boolean?onTouchEvent(MotionEvent?event)?{
????????int?action?=?event.getAction();
????????int?x?=?(int)?event.getX();
????????int?y?=?(int)?event.getY();
????????
//????????try?{
????????????switch?(action)?{
????????????case?MotionEvent.ACTION_DOWN:
????????????????changeState(STATE_RECORDING);
????????????????break;

????????????case?MotionEvent.ACTION_MOVE:
????????????????if?(isRecording)?{
????????????????????if?(wantToCancel(x,y))?{
????????????????????????changeState(STATE_WANT_TO_CANCEL);
????????????????????}else?{
????????????????????????changeState(STATE_RECORDING);
????????????????????}
????????????????}
????????????????break;
????????????case?MotionEvent.ACTION_UP:
????????????????if?(!mReady)?{
????????????????????reset();
????????????????????return?super.onTouchEvent(event);
????????????????}
????????????????if?(!isRecording||mTime<0.6f)?{//時間短,還沒有來得及repared
????????????????????mDailogManager.tooShort();
????????????????????mAudioManager.cancel();
????????????????????mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS,?1300);//1.3秒后關(guān)閉tooshort
????????????????}else????if?(mCurState==STATE_RECORDING)?{//正常錄制結(jié)束
????????????????????//release
????????????????????mDailogManager.dimissDialog();
????????????????????mAudioManager.release();
????????????????????//callbackToAct
????????????????????if?(mListener?!=?null)?{
????????????????????????mListener.onFinished(mTime,?mAudioManager.getCurrentFilePath());
????????????????????}
????????????????}else?if?(mCurState==STATE_WANT_TO_CANCEL)?{?
????????????????????//cancel
????????????????????mDailogManager.dimissDialog();
????????????????????mAudioManager.cancel();
????????????????}
????????????????reset();
????????????????break;
????????????}
//????????}?catch?(Exception?e)?{
//????????????System.out.println("1111111111111111111111111111");
//????????????e.printStackTrace();
//????????}
????????
????????return?super.onTouchEvent(event);
????????
????}
????????//恢復(fù)標(biāo)志位
????private?void?reset()?{

????????isRecording?=?false;
????????changeState(STATE_NORNMAL);
????????mTime?=?0;
????????mReady?=?false;
????}
????private?boolean?wantToCancel(int?x,?int?y)?{
????????if?(x<0?||?x>getWidth())?{
????????????return?true?;
????????}
????????if(y<-DISTANCE_Y_CANCEL?||?y>getHeight()+DISTANCE_Y_CANCEL)
????????{
????????????return?true;
????????}
????????return?false;
????}
????private?void?changeState(int?state)?{//state是將要邊車的狀態(tài)
????????if?(mCurState!=state)?{
????????????mCurState?=?state;
????????????switch?(state)?{
????????????case?STATE_NORNMAL:
????????????????setBackgroundResource(R.drawable.btn_recorder_normal);
????????????????setText(R.string.str_recorder_normal);
????????????????break;
????????????case?STATE_RECORDING:
????????????????setBackgroundResource(R.drawable.?btn_recording);
????????????????setText(R.string.str_recorder_recording);
????????????????if?(isRecording)?{
????????????????
????????????????????mDailogManager.recording();
????????????????}
????????????????break;
????????????case?STATE_WANT_TO_CANCEL:
????????????????setBackgroundResource(R.drawable.btn_recording);
????????????????setText(R.string.str_recorder_cancel);
????????????????
????????????????mDailogManager.wantToCancel();
????????????????break;
????????????}
????????}
????}

????

}


0 回復(fù) 有任何疑惑可以回復(fù)我~

我認(rèn)真的排查過,只有release()里置空過

package?com.imoc_recorder.view;

import?java.io.File;
import?java.io.IOException;
import?java.util.UUID;

import?android.R.integer;
import?android.media.MediaRecorder;
import?android.util.Log;

public?class?AudioManager?{
????
????private?MediaRecorder?mMediaRecorder;
????private?String?mDir;
????private?String?mCurrentFilePath;
????private?boolean?isPrepared;
????
????private?static?AudioManager?mInstance;
????private?AudioManager(String?dir){
????????mDir?=?dir;
????}
????/*
?????*?回調(diào)準(zhǔn)備完畢
?????*/
????public??interface?AudioStateListener?{
????????void?wellPrepared();
????}
????
????public?AudioStateListener?mListener;
????
????public?void??setOnAudioStateListener(AudioStateListener?listener)?{
????????mListener?=?listener;
????}
????public?static??AudioManager?getInstance(String?dir)?{
????????if?(mInstance?==?null)?{
????????????synchronized?(AudioManager.class)?{
????????????????if?(mInstance?==?null)?{
????????????????????mInstance?=?new?AudioManager(dir);
????????????????}
????????????}
????????}
????????return?mInstance;
????}
????
????//準(zhǔn)備
????public?void??prepareAudio()?{
????????try?{
????????????isPrepared?=?false;
????????????
????????????File?dir?=?new?File(mDir);
????????????if?(!dir.exists())?{
????????????????dir.mkdirs();
????????????????
????????????????String?fileName?=?generateFileName();
????????????????File?file?=?new?File(dir,fileName);
????????????????mCurrentFilePath?=?file.getAbsolutePath();
????????????????
????????????????mMediaRecorder?=?new?MediaRecorder();
????????????????//設(shè)置輸出文件
????????????????mMediaRecorder.setOutputFile(file.getAbsolutePath());
????????????????//設(shè)置MediaRecorder的音頻源為麥克風(fēng)
????????????????mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
????????????????//設(shè)置音頻的格式
????????????????mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
????????????????//設(shè)置音頻編碼為amr
????????????????mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
????????????????mMediaRecorder.prepare();
????????????????mMediaRecorder.start();
????????????????isPrepared?=?true;
????
????????????????if?(mListener?!=?null)?{
????????????????????mListener.wellPrepared();
????????????????}
????????????}
????????}?catch?(Exception?e)?{
????????????
????????????e.printStackTrace();
????????}
????}
????//隨機生成文件名
????private?String?generateFileName()?{
????????return?UUID.randomUUID().toString()+".amr";
????}

????public?int?getVoiceLevel(int?maxLevel)?{
????????if(isPrepared)
????????{
????????????try?{
????????????????return?maxLevel*mMediaRecorder.getMaxAmplitude()/32768+1;?//音頻的最大振幅1!32767~1
????????????}?catch?(Exception?e)?{
????????????
????????????????e.printStackTrace();
????????????}
????????}
????????return?1;
????}
????
????public?void?release()?{
????????mMediaRecorder.stop();
????????mMediaRecorder.release();
//????????mMediaRecorder?=?null;
????}
????public?void?cancel()?{
????????release();
????????if?(mCurrentFilePath?!=?null)?{
????????????File?file?=?new?File(mCurrentFilePath);
????????????file.delete();
????????????mCurrentFilePath?=?null;
????????}
????}
????public?String?getCurrentFilePath()?{
????????return?mCurrentFilePath;
????}

????
}


0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

安靜的y

try 下面if 的括號不對吧
2015-05-14 回復(fù) 有任何疑惑可以回復(fù)我~

舉報

0/150
提交
取消
Android-仿微信語音聊天
  • 參與學(xué)習(xí)       43189    人
  • 解答問題       248    個

結(jié)合自定義View和API,Dialog管理等實現(xiàn)實現(xiàn)微信語音

進入課程

Audio整合后測試出錯,希望hyman老師和同學(xué)們看下

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號