我正在开发一款Android应用程序,该应用程序使用SpeechRecognizer作为服务并且无限期地继续收听(这是可配置的),我面临着两个问题,所以我希望这里的任何人能够提供一些帮助。
第一个问题是在使用SpeechRecognizer启动的活动之后,LogCat中抛出了下一个错误(我也复制并粘贴了完整的LogCat):
E/ActivityThread(7865): Service com.xxx.xxx.MyService has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@85f41fe that was originally bound here
LogCat:
07-19 12:09:46.460: E/lightsbindercall(2268): virtual void android::BpLEDManager::restart() : Binder Transaction Start!!
07-19 12:09:46.461: E/lightsbindercall(2268): virtual void android::BpLEDManager::restart() : Binder Transaction End!! (error code 0)
07-19 12:09:46.486: E/lge_audio_pcm_dump(337): lge_set_dump_config: exit dump_config : 0
07-19 12:09:46.486: E/bt_a2dp_hw(337): adev_set_parameters: ERROR: set param called even when stream out is null
07-19 12:09:46.488: E/native(2268): do suspend false
07-19 12:09:48.389: E/ActivityThread(7865): Service com.testMe.testMe.MyService has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@85f41fe that was originally bound here
07-19 12:09:48.389: E/ActivityThread(7865): android.app.ServiceConnectionLeaked: Service com.testMe.testMe.MyService has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@85f41fe that was originally bound here
07-19 12:09:48.389: E/ActivityThread(7865): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1136)
07-19 12:09:48.389: E/ActivityThread(7865): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1030)
07-19 12:09:48.389: E/ActivityThread(7865): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1305)
07-19 12:09:48.389: E/ActivityThread(7865): at android.app.ContextImpl.bindService(ContextImpl.java:1288)
07-19 12:09:48.389: E/ActivityThread(7865): at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
07-19 12:09:48.389: E/ActivityThread(7865): at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:288)
07-19 12:09:48.389: E/ActivityThread(7865): at com.testMe.testMe.MyService$IncomingHandler.handleMessage(MyService.java:75)
07-19 12:09:48.389: E/ActivityThread(7865): at android.os.Handler.dispatchMessage(Handler.java:102)
07-19 12:09:48.389: E/ActivityThread(7865): at android.os.Looper.loop(Looper.java:148)
07-19 12:09:48.389: E/ActivityThread(7865): at android.app.ActivityThread.main(ActivityThread.java:5551)
07-19 12:09:48.389: E/ActivityThread(7865): at java.lang.reflect.Method.invoke(Native Method)
07-19 12:09:48.389: E/ActivityThread(7865): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
07-19 12:09:48.389: E/ActivityThread(7865): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
07-19 12:09:48.604: E/AudioRecord-JNI(20863): Error -4 during AudioRecord native read
07-19 12:09:48.676: E/audio_hw_primary(337): select_devices: enter and usecase(1)
07-19 12:09:48.676: E/audio_hw_primary(337): enable_snd_device: enter 2
07-19 12:09:49.498: E/NetlinkEvent(332): Failed to open ra_info_flag (No such file or directory)
07-19 12:09:49.803: E/NetlinkEvent(332): Failed to open ra_info_flag (No such file or directory)
07-19 12:09:49.803: E/NetlinkEvent(332): Failed to open ra_info_flag (No such file or directory)
07-19 12:09:49.803: E/NetlinkEvent(332): Failed to open ra_info_flag (No such file or directory)
07-19 12:09:49.868: E/WifiConfigStore(2268): saveWifiConfigBSSID Setting BSSID for "vodafone4E1C"-WPA_PSK to any
07-19 12:09:49.879: E/WifiConfigStore(2268): saveWifiConfigBSSID Setting BSSID for "vodafone4E1C"-WPA_PSK to any
07-19 12:09:49.900: E/WifiStateMachine(2268): Start Dhcp Watchdog 375
07-19 12:09:49.903: E/NetlinkEvent(332): NetlinkEvent::FindParam(): Parameter 'UID' not found
07-19 12:09:49.908: E/native(2268): do suspend false
07-19 12:09:49.909: E/WifiStateMachine(2268): CheckDhcpInfoCacheList : DhcpStateMachine.CMD_PRE_DHCP_ACTION[ConnectingState]
07-19 12:09:49.917: E/LocSvc_LBSApiV02(2268): E/virtual int lbs_core::LBSApiV02::wifiAttachmentStatusInject(const WifiSupplicantInfo&):660]: Error : st = 11, ind.status = -1228261996
07-19 12:09:49.988: E/NetlinkEvent(332): NetlinkEvent::FindParam(): Parameter 'UID' not found
07-19 12:09:50.010: E/ConnectivityService(2268): Unexpected mtu value: 0, wlan0
07-19 12:09:50.010: E/Netd(332): [LGE_DATA] modifyIpRoute wlan0
07-19 12:09:50.011: E/Netd(332): [LGE_DATA] modifyIpRoute wlan0
07-19 12:09:50.012: E/Netd(332): [LGE_DATA] modifyIpRoute wlan0
07-19 12:09:50.099: E/AlarmManager(2268): Exist canceled pending intent
07-19 12:09:50.099: E/AlarmManager(2268): Cancel 1 alarm(s) in package com.google.android.googlequicksearchbox
07-19 12:09:50.228: E/LocSvc_libulp(2268): E/int ulp_brain_transition_all_providers(), no QUIPC/GNSS transition logic run due to both engines are OFF
07-19 12:09:50.323: E/ConnectivityService(2268): BUG: NetworkAgentInfo [WIFI () - 578] already has NetworkRequest [ id=1, legacyType=-1, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN] ]
07-19 12:09:50.364: E/SetupWizard(4915): tickleCheckinService called after completing user setup
07-19 12:09:50.565: E/WeatherPlatformReceiver(20168): Application have permission so update all cities
07-19 12:09:50.569: E/LGDMClient(4878): [DmNotiService.java] [onCreate()] : [154] : DmNotiService.onCreate()
07-19 12:09:51.065: E/ConnectivityService(2268): put valid true
07-19 12:09:51.198: E/WeatherPlatformReceiver(20168): Application have permission so update all cities
07-19 12:09:51.213: E/LGDMClient(4878): [DmNotiService.java] [onCreate()] : [154] : DmNotiService.onCreate()
07-19 12:09:51.617: E/Exception(3283): SmackException: Client is already logged in
07-19 12:09:52.048: E/ConnectivityService(2268): put valid true
07-19 12:09:52.357: E/audio_hw_primary(337): disable_snd_device: enter 2
07-19 12:09:52.386: E/art(2993): invalid stream - problem with parameter iterator in /data/app/com.facebook.orca-2/base.apk:classes2.dex for method void com.facebook.fbservice.service.r.d(com.facebook.fbservice.service.r)
MyService.java(这是SpeechRecognizer服务):
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.util.Log;
public class MyService extends Service {
//protected static AudioManager mAudioManager;
protected SpeechRecognizer mSpeechRecognizer;
protected Intent mSpeechRecognizerIntent;
protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this));
protected boolean mIsListening;
protected volatile boolean mIsCountDownOn;
private static boolean mIsStreamSolo;
static final int MSG_RECOGNIZER_START_LISTENING = 1;
static final int MSG_RECOGNIZER_CANCEL = 2;
ResultReceiver resultReceiver;
@Override
public void onCreate() {
super.onCreate();
//mAudioManager = (AudioManager) getSystemService(this.AUDIO_SERVICE);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener());
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000L);
}
protected class IncomingHandler extends Handler {
private WeakReference<MyService> mtarget;
IncomingHandler(MyService target) {
mtarget = new WeakReference<MyService>(target);
}
@Override
public void handleMessage(Message msg) {
final MyService target = mtarget.get();
switch (msg.what) {
case MSG_RECOGNIZER_START_LISTENING:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
// turn off beep sound
if (!mIsStreamSolo) {
mIsStreamSolo = true;
}
}
if (!target.mIsListening) {
if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())){
target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent);
sendReceiver("startListening");
target.mIsListening = true;
//Log.d(TAG, "message start listening"); //$NON-NLS-1$
new CountDownTimer(2000, 1000) {
public void onTick(long millisUntilFinished) {
//do nothing, just let it tick
}
public void onFinish() {
target.mSpeechRecognizer.stopListening();
sendReceiver("stopListening");
}
}.start();
}
}
break;
case MSG_RECOGNIZER_CANCEL:
if (mIsStreamSolo) {
//mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, false);
mIsStreamSolo = false;
}
target.mSpeechRecognizer.cancel();
target.mIsListening = false;
//Log.d(TAG, "message canceled recognizer"); //$NON-NLS-1$
break;
}
}
}
private void sendReceiver(String strMessage){
Bundle bundle = new Bundle();
bundle.putString("speechResult", String.valueOf(strMessage));
resultReceiver.send(100, bundle);
}
// Count down timer for Jelly Bean work around
protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(2000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// TODO Auto-generated method stub
}
@Override
public void onFinish() {
startOver();
}
};
private void startOver() {
mIsCountDownOn = false;
Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL);
try {
mServerMessenger.send(message);
message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
mServerMessenger.send(message);
} catch (RemoteException e) {
}
}
@Override
public int onStartCommand (Intent intent, int flags, int startId) {
resultReceiver = intent.getParcelableExtra("receiver");
try {
Message msg = new Message();
msg.what = MSG_RECOGNIZER_START_LISTENING;
mServerMessenger.send(msg);
} catch (RemoteException e) {
}
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mIsCountDownOn) {
mNoSpeechCountDown.cancel();
}
if (mSpeechRecognizer != null) {
mSpeechRecognizer.stopListening();
mSpeechRecognizer.cancel();
mSpeechRecognizer.destroy();
}
}
protected class SpeechRecognitionListener implements RecognitionListener {
private static final String TAG = "abc";
@Override
public void onBeginningOfSpeech() {
// speech input will be processed, so there is no need for count down anymore
if (mIsCountDownOn) {
mIsCountDownOn = false;
mNoSpeechCountDown.cancel();
}
//Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
//Log.d(TAG, "onEndOfSpeech"); //$NON-NLS-1$
}
@Override
public void onError(int error) {
if (mIsCountDownOn) {
mIsCountDownOn = false;
mNoSpeechCountDown.cancel();
}
mIsListening = false;
Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
try {
mServerMessenger.send(message);
} catch (RemoteException e) {
}
//Log.d(TAG, "error = " + error); //$NON-NLS-1$
}
@Override
public void onEvent(int eventType, Bundle params) {
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onReadyForSpeech(Bundle params) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mIsCountDownOn = true;
mNoSpeechCountDown.start();
}
Log.d(TAG, "onReadyForSpeech"); //$NON-NLS-1$
}
@Override
public void onResults(Bundle results) {
String str = new String();
Log.d(TAG, "onResults " + results);
ArrayList<String> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
for (int i = 0; i < data.size(); i++) {
Log.d(TAG, "result " + data.get(i));
str += "@@" + data.get(i);
}
sendReceiver(str);
startOver();
}
@Override
public void onRmsChanged(float rmsdB) {
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
调用服务的主要活动中的类(这是在片段中专门完成的):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
startRecognitionService();
...
}
private void startRecognitionService(){
Context context = getActivity().getApplicationContext();
((ActivityTest) getActivity()).muteAudio();
resultReceiver = new MyResultReceiver(null);
myService = new Intent(context, MyService.class);
myService.putExtra("receiver", resultReceiver);
context.startService(myService);
}
片段中的子类处理服务结果:
class MyResultReceiver extends ResultReceiver {
public MyResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
String speechResult = resultData.getString("speechResult");
UpdateUI action = new UpdateUI("Result Received: "+speechResult);
if (speechResult!=null && action!=null && getActivity()!=null){
getActivity().runOnUiThread(action);
}
}
}
class UpdateUI implements Runnable {
String updateString;
public UpdateUI(String updateString) {
this.updateString = updateString;
}
public void run() {
if (updateString.contains("startListening") || updateString.contains("stopListening")){
Activity activity = getActivity();
Context context = activity.getApplicationContext();
TextView tvQuestionNumber = (TextView) activity.findViewById(R.id.llBody).findViewById(R.id.tvQuestionNumber);
int drawablePadding = GeneralUtils.dp2px(5, context);
tvQuestionNumber.setCompoundDrawablePadding(drawablePadding);
int imgRecord=0;
if (updateString.contains("startListening")){
imgRecord = context.getResources().getIdentifier("record", "drawable", context.getPackageName());
}else{
if (updateString.contains("stopListening")){
imgRecord = context.getResources().getIdentifier("record_clear", "drawable", context.getPackageName());
}
}
if (imgRecord != 0) {
Drawable left = context.getResources().getDrawable(imgRecord);
tvQuestionNumber.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
}
}else{
String result = String.valueOf(updateString).toLowerCase();
int nroPage = mViewPager.getCurrentItem();
if (result.contains("next")||result.contains("siguiente")){
mViewPager.setCurrentItem(nroPage+1);
}
if (result.contains("previous")||result.contains("anterior")){
mViewPager.setCurrentItem(nroPage-1);
}
if (result.contains("einstein")){
cbAnswer[4*(pageNumber-1)+0].callOnClick();
}else{
if (result.contains("copérnico")){
cbAnswer[4*(pageNumber-1)+1].callOnClick();
}else{
if (result.contains("tesla")){
cbAnswer[4*(pageNumber-1)+2].callOnClick();
}else{
if (result.contains("newton")){
cbAnswer[4*(pageNumber-1)+3].callOnClick();
}
}
}
}
}
}
}
该服务刚刚开始正常并收听,但第二个问题是在一段时间后停止收听。我添加了一个小的记录图标,它出现并消失,因此用户知道应用程序何时正在收听,一段时间后它停止监听并且小记录图标停止显示(我使用结果接收器来传达服务和调用类),如下所示: / p>
class MyResultReceiver extends ResultReceiver {
public MyResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
String speechResult = resultData.getString("speechResult");
getActivity().runOnUiThread(new UpdateUI("Result Received: "+speechResult));
}
}
class UpdateUI implements Runnable {
String updateString;
public UpdateUI(String updateString) {
this.updateString = updateString;
}
public void run() {
String result = String.valueOf(updateString).toLowerCase();
int nroPage = mViewPager.getCurrentItem();
if (result.contains("einstein")){
cbAnswer[4*(pageNumber-1)+0].callOnClick();
}else{
if (result.contains("copérnico")){
cbAnswer[4*(pageNumber-1)+1].callOnClick();
}else{
if (result.contains("tesla")){
cbAnswer[4*(pageNumber-1)+2].callOnClick();
}else{
if (result.contains("newton")){
cbAnswer[4*(pageNumber-1)+3].callOnClick();
}
}
}
}
if (result.contains("next")||result.contains("siguiente")){
mViewPager.setCurrentItem(nroPage+1);
}
if (result.contains("previous")||result.contains("anterior")){
mViewPager.setCurrentItem(nroPage-1);
}
}
}
好的,我希望给出的信息足以让某人给予帮助,如果不是让我知道,当然还要提前多多谢谢!!
PS。
我添加LogCat的其他部分,我猜它会显示与识别器停止侦听相关的错误或问题:
07-19 14:11:10.383:E / ACDB-LOADER(337):错误:ACDB AudProc vol返回= -19 07-19 14:11:10.387:E / AudioRecord-JNI(20863):AudioRecord本机读取期间出错-4 07-19 14:11:10.406:E / linker(20863):readlink(&#39; / proc / self / fd / 48&#39;)失败:权限被拒绝[fd = 48] 07-19 14:11:10.407:E / linker(20863):警告:无法获得库的实时路径&#34; libstagefrighthw.so&#34;。将使用给定的名称。 07-19 14:11:10.455:E / linker(20863):readlink(&#39; / proc / self / fd / 48&#39;)失败:权限被拒绝[fd = 48] 07-19 14:11:10.455:E / linker(20863):警告:无法获取库的实际路径&#34; libOmxCore.so&#34;。将使用给定的名称。 07-19 14:11:10.476:E / OMXMaster(20863):名称的组成部分&#39; OMX.qcom.audio.decoder.aac&#39;已经存在,忽略了这个。 07-19 14:11:10.482:E / linker(20863):readlink(&#39; / proc / self / fd / 48&#39;)失败:权限被拒绝[fd = 48] 07-19 14:11:10.482:E / linker(20863):警告:无法获取库的实际路径&#34; libstagefright_soft_amrwbenc.so&#34;。将使用给定的名称。 07-19 14:11:10.486:E / audio_hw_primary(337):select_devices:enter和usecase(1) 07-19 14:11:10.486:E / audio_hw_primary(337):select_devices:enter和usecase(7) 07-19 14:11:10.518:E / audio_hw_primary(337):disable_snd_device:输入129 07-19 14:11:10.577:E / ChromiumNetwork(20863):上传方法中的例外情况 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.shared.exception.GsaIOException:错误代码:262182 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.shared.io.am.abort(QueueDataSource.java:108) 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.search.core.k.k.abort(EagerDataSource.java:98) 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.search.core.k.a.m.a(MonitoredCronetRequest.java:181) 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.search.core.k.a.a.close(CronetAsyncConnectionResources.java:1168) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.search.core.k.a.disconnect(AsyncHttpConnection.java:90) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.search.core.k.e $ 2.onSuccess(AsyncHttpEngine.java:1276) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.common.util.concurrent.aq $ 2.run(Futures.java:1136) 07-19 14:11:10.577:E / ChromiumNetwork(20863):在com.google.common.util.concurrent.bi.execute(MoreExecutors.java:437) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.common.util.concurrent.al.a(ExecutionList.java:143) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.common.util.concurrent.al.b(ExecutionList.java:89) 07-19 14:11:10.577:E / ChromiumNetwork(20863):在com.google.common.util.concurrent.bd.addListener(ListenableFutureTask.java:82) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.common.util.concurrent.aq.a(Futures.java:1139) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.common.util.concurrent.aq.a(Futures.java:1077) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.search.core.k.e.disconnect(AsyncHttpEngine.java:271) 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.shared.io.h.disconnect(ConnectionWrapper.java:246) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.r.i.Ns(PairHttpConnection.java:394) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.r.g.run(PairHttpConnection.java:299) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:423) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at java.util.concurrent.FutureTask.run(FutureTask.java:237) 07-19 14:11:10.577:E / ChromiumNetwork(20863):com.google.android.apps.gsa.shared.util.concurrent.a.af.run(TaskRunnerFutureTask.java:122) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.shared.util.concurrent.a.aq.run(ThrottlingExecutor.java:139) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at java.lang.Thread.run(Thread.java:818) 07-19 14:11:10.577:E / ChromiumNetwork(20863):at com.google.android.apps.gsa.shared.util.concurrent.a.aa $ 1.run(GsaThreadFactory.java:104) 07-19 14:11:12.348:E / AudioRecord-JNI(20863):AudioRecord本机读取期间出错-4 07-19 14:11:12.398:E / audio_hw_primary(337):disable_snd_device:输入129 07-19 14:11:12.627:E / audio_hw_primary(337):select_devices:enter和usecase(7) 07-19 14:11:12.627:E / audio_hw_primary(337):enable_snd_device:输入129 07-19 14:11:12.627:E / ACDB-LOADER(337):错误:ACDB AudProc vol返回= -19 07-19 14:11:12.913:E / linker(20863):readlink(&#39; / proc / self / fd / 48&#39;)失败:权限被拒绝[fd = 48] 07-19 14:11:12.913:E / linker(20863):警告:无法获取库的实际路径&#34; libstagefright_soft_amrwbenc.so&#34;。将使用给定的名称。 07-19 14:11:14.568:E / AudioRecord-JNI(20863):AudioRecord本机读取期间出错-4 07-19 14:11:14.618:E / audio_hw_primary(337):disable_snd_device:输入129 07-19 14:11:14.807:E / audio_hw_primary(337):select_devices:enter和usecase(7) 07-19 14:11:14.807:E / audio_hw_primary(337):enable_snd_device:输入129 07-19 14:11:14.808:E / ACDB-LOADER(337):错误:ACDB AudProc vol返回= -19 07-19 14:11:14.809:E / AudioRecord-JNI(20863):AudioRecord原生读取错误-4