<div><br></div> <div><로그캣></div> <div>09-09 06:05:41.679 14263-14263/ado.recordtest E/AndroidRuntime: FATAL EXCEPTION: main</div> <div> Process: ado.recordtest, PID: 14263</div> <div> java.lang.RuntimeException: setAudioSource failed.</div> <div> at android.media.MediaRecorder.setAudioSource(Native Method)</div> <div> at ado.recordtest.AddActivity$1.onClick(AddActivity.java:79)</div> <div> at android.view.View.performClick(View.java:5204)</div> <div> at android.view.View$PerformClick.run(View.java:21153)</div> <div> at android.os.Handler.handleCallback(Handler.java:739)</div> <div> at android.os.Handler.dispatchMessage(Handler.java:95)</div> <div> at android.os.Looper.loop(Looper.java:148)</div> <div> at android.app.ActivityThread.main(ActivityThread.java:5417)</div> <div> at java.lang.reflect.Method.invoke(Native Method)</div> <div> at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)</div> <div> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616).</div> <div><br></div> <div><문제가 되는 부분></div> <div><br></div> <div><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;">if </span>(<span style="color:#660e7a;font-weight:bold;">recorder </span>!= <span style="color:#000080;font-weight:bold;">null</span>){ <span style="color:#808080;font-style:italic;">// recorder에 뭐가 들어있으면 초기화해줌<br></span><span style="color:#808080;font-style:italic;"> </span><span style="color:#660e7a;font-weight:bold;">recorder</span>.stop();<br><span style="color:#660e7a;font-weight:bold;">recorder</span>.release();<br><span style="color:#660e7a;font-weight:bold;">recorder </span>= <span style="color:#000080;font-weight:bold;">null</span>;<br>}<br><br><span style="color:#000080;font-weight:bold;">try </span>{<br><span style="color:#660e7a;font-weight:bold;">recorder </span>= <span style="color:#000080;font-weight:bold;">new </span>MediaRecorder();<br><span style="color:#660e7a;font-weight:bold;">recorder</span>.setAudioSource(MediaRecorder.AudioSource.<span style="color:#660e7a;font-weight:bold;font-style:italic;">MIC</span>); <<== 여기!<br><span style="color:#660e7a;font-weight:bold;">recorder</span>.setOutputFormat(MediaRecorder.OutputFormat.<span style="color:#660e7a;font-weight:bold;font-style:italic;">MPEG_4</span>);<br><span style="color:#660e7a;font-weight:bold;">recorder</span>.setAudioEncoder(MediaRecorder.AudioEncoder.<span style="color:#660e7a;font-weight:bold;font-style:italic;">DEFAULT</span>);<br><br><span style="color:#660e7a;font-weight:bold;">recorder</span>.setOutputFile(<span style="color:#660e7a;font-weight:bold;font-style:italic;">RECORD_FILE </span>+ getTagId() + <span style="color:#660e7a;font-weight:bold;font-style:italic;">RECORD_TYPE</span>);<br><br> Toast.<span style="font-style:italic;">makeText</span>(AddActivity.<span style="color:#000080;font-weight:bold;">this</span>, <span style="color:#008000;font-weight:bold;">"녹음을 시작합니다."</span>, Toast.<span style="color:#660e7a;font-weight:bold;font-style:italic;">LENGTH_SHORT</span>).show();<br><span style="color:#660e7a;font-weight:bold;">recorder</span>.prepare();<br><span style="color:#660e7a;font-weight:bold;">recorder</span>.start();<br>} <span style="color:#000080;font-weight:bold;">catch </span>(IOException e) {<br> e.printStackTrace();<br>}</pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;"><퍼미션- 매니페스트></pre><pre style="font-family:'굴림체';font-size:9pt;"><<span style="color:#000080;font-weight:bold;">uses-permission </span><span style="color:#660e7a;font-weight:bold;">android</span><span style="color:#0000ff;font-weight:bold;">:name=</span><span style="color:#008000;font-weight:bold;">"android.permission.RECORD_AUDIO" </span>/><br><<span style="color:#000080;font-weight:bold;">uses-permission </span><span style="color:#660e7a;font-weight:bold;">android</span><span style="color:#0000ff;font-weight:bold;">:name=</span><span style="color:#008000;font-weight:bold;">"android.permission.WRITE_EXTERNAL_STORAGE"</span>/></pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;"><코드상 퍼미션 확인></pre><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;">final static int </span><span style="color:#660e7a;font-weight:bold;font-style:italic;">MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE </span>= <span style="color:#0000ff;">100</span>;<br><span style="color:#000080;font-weight:bold;">final static int </span><span style="color:#660e7a;font-weight:bold;font-style:italic;">MY_PERMISSIONS_REQUEST_RECORD_AUDIO </span>= <span style="color:#0000ff;">200</span>;<br><br><span style="color:#000080;font-weight:bold;">public void </span>checkPermission(){<br><br><span style="color:#000080;font-weight:bold;">int </span>permissionCheck_RECORD = ContextCompat.<span style="font-style:italic;">checkSelfPermission</span>(<span style="color:#000080;font-weight:bold;">this</span>, Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">RECORD_AUDIO</span>);<br><span style="color:#000080;font-weight:bold;">int </span>permissionCheck_WRITE = ContextCompat.<span style="font-style:italic;">checkSelfPermission</span>(<span style="color:#000080;font-weight:bold;">this</span>, Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">WRITE_EXTERNAL_STORAGE</span>);<br><span style="color:#808080;font-style:italic;"> <br></span><span style="color:#808080;font-style:italic;"> </span><span style="color:#000080;font-weight:bold;">if </span>(ContextCompat.<span style="font-style:italic;">checkSelfPermission</span>(<span style="color:#000080;font-weight:bold;">this</span>, android.Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">RECORD_AUDIO</span>)!= PackageManager.<span style="color:#660e7a;font-weight:bold;font-style:italic;">PERMISSION_GRANTED</span>){<br><span style="color:#808080;font-style:italic;">//(ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)<br></span><span style="color:#808080;font-style:italic;"> <br></span><span style="color:#808080;font-style:italic;"> </span><span style="color:#000080;font-weight:bold;">if </span>( (ActivityCompat.<span style="font-style:italic;">shouldShowRequestPermissionRationale</span>(<span style="color:#000080;font-weight:bold;">this</span>, android.Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">RECORD_AUDIO</span>)) ||<br> (ActivityCompat.<span style="font-style:italic;">shouldShowRequestPermissionRationale</span>(<span style="color:#000080;font-weight:bold;">this</span>, android.Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">WRITE_EXTERNAL_STORAGE</span>))){<br><br><span style="color:#808080;font-style:italic;">// 다이어로그같은것을 띄워서 사용자에게 해당 권한이 필요한 이유에 대해 설명합니다<br></span><span style="color:#808080;font-style:italic;"> // 해당 설명이 끝난뒤 requestPermissions()함수를 호출하여 권한허가를 요청해야 합니다<br></span><span style="color:#808080;font-style:italic;"><br></span><span style="color:#808080;font-style:italic;"> </span>} <span style="color:#000080;font-weight:bold;">else </span>{<br><br> ActivityCompat.<span style="font-style:italic;">requestPermissions</span>(<span style="color:#000080;font-weight:bold;">this</span>, <span style="color:#000080;font-weight:bold;">new </span>String[]{android.Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">ACCESS_COARSE_LOCATION</span>}, <span style="color:#660e7a;font-weight:bold;font-style:italic;">MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE</span>);<br> ActivityCompat.<span style="font-style:italic;">requestPermissions</span>(<span style="color:#000080;font-weight:bold;">this</span>, <span style="color:#000080;font-weight:bold;">new </span>String[]{android.Manifest.permission.<span style="color:#660e7a;font-weight:bold;font-style:italic;">ACCESS_FINE_LOCATION</span>}, <span style="color:#660e7a;font-weight:bold;font-style:italic;">MY_PERMISSIONS_REQUEST_RECORD_AUDIO</span>);<br><br><span style="color:#808080;font-style:italic;">// 필요한 권한과 요청 코드를 넣어서 권한허가요청에 대한 결과를 받아야 합니다<br></span><span style="color:#808080;font-style:italic;"><br></span><span style="color:#808080;font-style:italic;"> </span>}<br> }<br> }</pre><pre style="font-family:'굴림체';font-size:9pt;"><br></pre><pre style="font-family:'굴림체';font-size:9pt;"><<span style="font-size:9pt;line-height:1.5;">MediaRecorder </span><span style="font-size:9pt;line-height:1.5;">import></span></pre><pre style="font-family:'굴림체';font-size:9pt;"><span style="color:#000080;font-weight:bold;">import </span>android.media.MediaPlayer;<br><span style="color:#000080;font-weight:bold;">import </span>android.media.MediaRecorder;</pre><pre style="font-family:'굴림체';font-size:9pt;">========================================================</pre><pre style="font-family:'굴림체';font-size:9pt;">기존에 있는 오픈소스 사용한거고.. </pre><pre style="font-family:'굴림체';font-size:9pt;">마시멜로우 이상이기 때문에 (자꾸 오류가 나서..) 코드상으로 퍼미션 확인해주는 코드를 추가해주었습니다.</pre><pre style="font-family:'굴림체';font-size:9pt;">녹음 버튼을 누르면 녹음이 되는 기능인데요..ㅠㅠ 제가 생각할 때는 퍼미션도 제대로 들어갔고..</pre><pre style="font-family:'굴림체';font-size:9pt;">기존에 다른 분들이 정상적으로 돌아간다고 올려놓은거 참고해서 한건데 안돌아가니까 당황스러워요..</pre><pre style="font-family:'굴림체';font-size:9pt;">딱히 로그캣에서도 확인이 어렵고 ㅠㅠ 저 부분이 문제당! 하는데 검색해봐도 답이 나오질 않아서 며칠 맘고생하다가 ㅠㅠ</pre><pre style="font-family:'굴림체';font-size:9pt;">이제야 질문을 올립니다 도와주세요!! 왜그럴까요!? ㅠㅠ</pre></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.