java - MediaRecorder throws exception when setting audio source (android developing) -


i trying build simple app record voice command , send amazon alexa, purpose following tutorial record voice command. following code snippet causes me trouble:

import android.app.activity; import android.media.mediaplayer; import android.media.mediarecorder; import android.os.bundle; import android.os.environment; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.button; import android.widget.toast;  import java.io.ioexception;   public class mainactivity extends activity {     button play,stop,record;     private mediarecorder myaudiorecorder;     private string outputfile = null;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);      play=(button)findviewbyid(r.id.button3);     stop=(button)findviewbyid(r.id.button2);     record=(button)findviewbyid(r.id.button);      stop.setenabled(false);     play.setenabled(false);     outputfile = environment.getexternalstoragedirectory().getabsolutepath() + "/recording.3gp";;      myaudiorecorder=new mediarecorder();     myaudiorecorder.setaudiosource(mediarecorder.audiosource.mic); ***error***     myaudiorecorder.setoutputformat(mediarecorder.outputformat.three_gpp);     myaudiorecorder.setaudioencoder(mediarecorder.outputformat.amr_nb);     myaudiorecorder.setoutputfile(outputfile); 

by throwing following error stack:

fatal exception: main                                                                           process: com.example.michael.test, pid: 20504                                                                           java.lang.runtimeexception: unable start activity componentinfo{com.example.michael.test/com.example.michael.test.mainactivity}: java.lang.runtimeexception: setaudiosource failed.                                                                               @ android.app.activitythread.performlaunchactivity(activitythread.java:2416)                                                                               @ android.app.activitythread.handlelaunchactivity(activitythread.java:2476)                                                                               @ android.app.activitythread.-wrap11(activitythread.java)                                                                               @ 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)                                                                               @ java.lang.reflect.method.invoke(native method)                                                                               @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:726)                                                                               @ com.android.internal.os.zygoteinit.main(zygoteinit.java:616)                                                                            caused by: java.lang.runtimeexception: setaudiosource failed.                                                                               @ android.media.mediarecorder.setaudiosource(native method)                                                                               @ com.example.michael.test.mainactivity.oncreate(mainactivity.java:37)                                                                               @ android.app.activity.performcreate(activity.java:6251)                                                                               @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1107)                                                                               @ android.app.activitythread.performlaunchactivity(activitythread.java:2369)                                                                               @ android.app.activitythread.handlelaunchactivity(activitythread.java:2476)                                                                                @ android.app.activitythread.-wrap11(activitythread.java)                                                                                @ 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)                                                                                @ java.lang.reflect.method.invoke(native method)                                                                                @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:726)                                                                                @ com.android.internal.os.zygoteinit.main(zygoteinit.java:616)  04-25 12:35:39.109 20504-20504/com.example.michael.test i/process: sending signal. pid: 20504 sig: 9 

all googling points issue being rights not set app access audio source, androidmanifest.xml include following lines:

    <uses-permission android:name="android.permission.modify_audio_settings" /> <uses-permission android:name="android.permission.record_audio" /> <uses-permission android:name="android.permission.write_external_storage" /> <uses-permission android:name="android.permission.read_external_storage" /> <uses-permission android:name="android.permission.write_settings" /> 

so @ loss else going wrong here... developing android studio using lg nexus 5 android 6.0.1 test. sdk set android 5.0.

after 3 days of research, decided check application manager (settings > applications > application manager > myrecorderapp > permissions) while myrecorderapp running. turned out, there no "dangerous permissions" (as google calls them) myrecorderapp, turned them on manually first (my app stopped crashing ever since) led me find information below (from google , this blog).

beginning in android 6.0 (api level 23), users grant permissions apps while app running, not when install app.

quote google: complete explanation google's developers website

below short version of code derived google's page , aforementioned sources. idea ask user permission record audio , access phone's folder first time launch app, is, after install it. worked android m (6.0.1), android studio 2.1.1

add following declarations

private boolean permissiontorecordaccepted = false; private boolean permissiontowriteaccepted = false; private string [] permissions = {"android.permission.record_audio", "android.permission.write_external_storage"}; 

add following override code block. can add android studio template pressing "alt" + "insert" (windows) or "control" + "o" (mac), onrequestpermissionsresult option down list.

@override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) {     super.onrequestpermissionsresult(requestcode, permissions, grantresults);     switch (requestcode){         case 200:             permissiontorecordaccepted  = grantresults[0] == packagemanager.permission_granted;             permissiontowriteaccepted  = grantresults[1] == packagemanager.permission_granted;             break;     }     if (!permissiontorecordaccepted ) mainactivity.super.finish();     if (!permissiontowriteaccepted ) mainactivity.super.finish();  } 

finally, add " if " statement oncreate.

@override protected void oncreate(bundle savedinstancestate) {      super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);      // add following code oncreate     int requestcode = 200;     if (build.version.sdk_int >= build.version_codes.m) {         requestpermissions(permissions, requestcode);     }  } 

Comments

Popular posts from this blog

javascript - How to get current YouTube IDs via iMacros? -

c# - Maintaining a program folder in program files out of date? -

emulation - Android map show my location didn't work -