returnandroid
Ⅰ 有人用過android 4.1的新API里的AcousticEchoCanceler 回聲消除嗎
下面簡單的備忘下AcousticEchoCanceler的使用方法:
1)判斷當前機型是否支持AEC,需要注意這里的檢查不一定準確。
public static boolean isDeviceSupport()
{
return AcousticEchoCanceler.isAvailable();
}
2)初始化並使能AEC。
private AcousticEchoCanceler canceler;
public boolean initAEC(int audioSession)
{
if (canceler != null)
{
return false;
}
canceler = AcousticEchoCanceler.create(audioSession);
canceler.setEnabled(true);
return canceler.getEnabled();
}
3)使能/去使能AEC。
public boolean setAECEnabled(boolean enable)
{
if (null == canceler)
{
return false;
}
canceler.setEnabled(enable);
return canceler.getEnabled();
}
4)釋放AEC。
public boolean release()
{
if (null == canceler)
{
return false;
}
canceler.setEnabled(false);
canceler.release();
return true;
}
AcousticEchoCanceler的初始化需要一個sessionid,下面簡單的備忘下上層的調用方式:
1)初始化AudioRecord的時候需要處理第一個參數。
if (chkNewDev())
{
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, frequency, channelIN, audioEncoding, tmpSize);
}else
{
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelIN, audioEncoding, tmpSize);
}
2)初始化好audioRecord之後,就可以通過
audioRecord.getAudioSessionId()
獲取到相應的sessionid。
3)初始化AudioTrack時,也需要額外的處理sessionid。
if (chkNewDev() && audioRecord != null)
{
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM,audioRecord.getAudioSessionId());
}
else
{
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM);
}
另外,由於API的限制,需要考慮機型不匹配的情況:
public static boolean chkNewDev()
{
return android.os.Build.VERSION.SDK_INT >= 16;
}
許可權:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
總結:
1)android新版本增加的API AcousticEchoCanceler 可以非常快速的開發出符合VOIP性質的回聲消除程序。但是考慮到各種機型適配,仍然需要第三方的回聲消除程序。這里主要推薦兩個:webrtc裡面的AEC/AECM,speex。
作者成功的在項目中使用了webrtc裡面的回聲消除,感覺效果還可以。
2)作者編寫的上述代碼也只是根據官方的介紹編寫的,由於資料較少,不能保證代碼的正確性。
轉載
Ⅱ android ontouch事件return true和return false的區別
1,return false說明你還沒消費onTouch事件,在執行完你onTouch裡面的代碼之後,onTouch事件並沒有結束。就是會自動地執行Gallery這個view里onTouch代碼(這個為默認).所以這就是為什麼沒增加你的處理的時候就只自動地調用Gallery的onTouch,若你在onTouch裡面增加你的代碼並且return false就會執行你的處理和默認的處理。
2,return true說明你已經消費完了onTouch事件,在執行完你的onTouch裡面的代碼之後,這個onTouch事件就結束了。也就是說不會再調用默認的onTouch事件了。在onTouch裡面有很多種的處理比如move,down,up....,若你在move裡面return false,那麼接著的fling,up等後面的事件也不會處理的。
Ⅲ android,return START_STICKY; ...super.handleMessage(msg);...何時需要屏蔽super();,,為啥呢
super()是調用父類的無參數構造方法。。。。。。。何時需要super,得看需求邏輯是不是調用父類的方法過程。
Ⅳ Android中判斷是否有前置攝像頭,後置攝像頭的方法
下面的代碼為一系列的方法,用來判斷是否有前置攝像頭(Front Camera),後置攝像頭。
private static boolean checkCameraFacing(final int facing) {
if (getSdkVersion() < Build.VERSION_CODES.GINGERBREAD) {
return false;
}
final int cameraCount = Camera.getNumberOfCameras();
CameraInfo info = new CameraInfo();
for (int i = 0; i < cameraCount; i++) {
Camera.getCameraInfo(i, info);
if (facing == info.facing) {
return true;
}
}
return false;
}
public static boolean hasBackFacingCamera() {
final int CAMERA_FACING_BACK = 0;
return checkCameraFacing(CAMERA_FACING_BACK);
}
public static boolean hasFrontFacingCamera() {
final int CAMERA_FACING_BACK = 1;
return checkCameraFacing(CAMERA_FACING_BACK);
}
public static int getSdkVersion() {
return android.os.Build.VERSION.SDK_INT;
}
注意:由於getNumberOfCameras以及getCameraInfo均為API 9 引入,所以方法只適用於2.3及其以上。
Ⅳ android 如何用代碼實現EditText控制項中只能輸入數字
數字<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number" />
帶小數的數字 <EditText
android:id="@+id/editText3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal" />
電話號碼的 <EditText
android:id="@+id/editText4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone" />