6

MediaRecorder를 사용하여 내 활동 중 하나에서 오디오를 녹음하려고합니다. 아래에 코드의 일부가 나와 있습니다.java.lang.RuntimeException : 시작 실패

File file = new File(AppConstants.MSGS_DIR, filename); 
MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioSource(AudioSource.MIC); 
recorder.setOutputFormat(OutputFormat.THREE_GPP); 
recorder.setAudioEncoder(AudioEncoder.AMR_WB); 
recorder.setOutputFile(file.getAbsolutePath()); 
try { 
    recorder.prepare(); 
    recorder.start(); 
} catch (IOException e) { 
    System.out.println("Exception: " + e.getMessage()); 
} 

매니페스트 파일에 다음 권한을 부여했습니다.

<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" /> 

하지만 라인 recorder.start() 내가 런타임 예외를 얻고에서

. Logcat은 다음과 같은 오류 메시지를 표시합니다.

09-23 15:47:54.462: E/AndroidRuntime(8697): FATAL EXCEPTION: main 
09-23 15:47:54.462: E/AndroidRuntime(8697): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage/com.mypackage.RecordingActivity}: java.lang.RuntimeException: start failed. 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2250) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2300) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.ActivityThread.access$600(ActivityThread.java:144) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1295) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.os.Looper.loop(Looper.java:150) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.ActivityThread.main(ActivityThread.java:5162) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at java.lang.reflect.Method.invoke(Method.java:525) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:744) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at dalvik.system.NativeStart.main(Native Method) 
09-23 15:47:54.462: E/AndroidRuntime(8697): Caused by: java.lang.RuntimeException: start failed. 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.media.MediaRecorder.start(Native Method) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at com.mypackage.RecordingActivity.startRecording(RecordingActivity.java:169) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at com.mypackage.RecordingActivity.onCreate(RecordingActivity.java:107) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.Activity.performCreate(Activity.java:5288) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
09-23 15:47:54.462: E/AndroidRuntime(8697):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2214) 

stackoverflow의 오류에 해당하는 시도를했지만 유효한 대답을 결론 지을 수 없습니다. 이것을 확인하고 코드에서 잘못 될 수 있도록 도와주세요.

FYI>이 특정 코드는 특정 장치에서만 작동하지 않습니다. 추가 권한이 누락 되었습니까?

+0

http://stackoverflow.com/a/10497885/1777090 –

+0

@MysticMagic 나는 오디오 녹음을 찾고있는 나는 폭과 높이와 관련이 없다고 느낍니다. 귀하가 제기 한 답변은 비디오 녹화를위한 것입니다. – Jeeri

+1

_ 특정 장치에서만 오류가 발생했습니다 _ - 해당 장치에 대한 자세한 정보를 포함 할 수 있습니다. 플랫폼 버전은 무엇입니까? AudioEncoder.AMR_WB는 API10에서만 사용할 수 있습니다. – ozbek

답변

3

AudioEncoder.AMR_WB 인코딩뿐만 아니라 3GP 형식을 지원하지 않기 때문에 일부 장치가 지원하지 않습니다. 지원되는 형식을 확인하려면 here을 클릭하십시오.

최대 장치 수를 지원하는 아래 코드를 사용하십시오.

recorder.setOutputFormat(OutputFormat.MPEG_4); 
recorder.setAudioEncoder(AudioEncoder.AAC); 
+0

어때요? android 2.2? –

+1

android M ?? –

+1

에 대해 어떻게됩니까? 모든 장치의 기본 작업은? like like recorder.setOutputFormat (OutputFormat.DEFAULT) ; recorder.setAudioEncoder (AudioEncoder.DEFAULT); – SimpleCoder

0

당신이 다음 부여 된 권한을 만들 API 광고 (23)를 사용하는 경우 먼저 녹음을 시작

 private boolean checkAndRequestPermissions() { 
      int permissionSendMessage = ContextCompat.checkSelfPermission(this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE); 
      int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO); 
      List<String> listPermissionsNeeded = new ArrayList<>(); 
      if (locationPermission != PackageManager.PERMISSION_GRANTED) { 
       listPermissionsNeeded.add(Manifest.permission.RECORD_AUDIO); 
      } 
      if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) { 
       listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
      } 
      if (!listPermissionsNeeded.isEmpty()) { 
       ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS); 
       return false; 
      } 
      return true; 
     } 
     @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) { 
     Log.d("TAG", "Permission callback called-------"); 
     switch (requestCode) { 
      case REQUEST_ID_MULTIPLE_PERMISSIONS: { 

       Map<String, Integer> perms = new HashMap<>(); 
       // Initialize the map with both permissions 
       perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); 
       perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED); 
       // Fill with actual results from user 
       if (grantResults.length > 0) { 
        for (int i = 0; i < permissions.length; i++) 
         perms.put(permissions[i], grantResults[i]); 
        // Check for both permissions 
        if (perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
          && perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { 
         Log.d("TAG", "sms & location services permission granted"); 
         // process the normal flow 

         pager = (ViewPager) findViewById(R.id.pager); 
         pager.setAdapter(new MyAdapter(getSupportFragmentManager())); 
         tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs); 
         tabs.setViewPager(pager); 
         //else any one or both the permissions are not granted 
        } else { 
         Log.d("TAG", "Some permissions are not granted ask again "); 
         //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission 
//      // shouldShowRequestPermissionRationale will return true 
         //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup. 
         if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) || 
           ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { 
          showDialogOK("SMS and Location Services Permission required for this app", 
            new DialogInterface.OnClickListener() { 
             @Override 
             public void onClick(DialogInterface dialog, int which) { 
              switch (which) { 
               case DialogInterface.BUTTON_POSITIVE: 
                checkAndRequestPermissions(); 
                break; 
               case DialogInterface.BUTTON_NEGATIVE: 
                // proceed with logic by disabling the related features or quit the app. 
                break; 
              } 
             } 
            }); 
         } 
         //permission is denied (and never ask again is checked) 
         //shouldShowRequestPermissionRationale will return false 
         else { 
          Toast.makeText(this, "Go to settings and enable permissions", Toast.LENGTH_LONG) 
            .show(); 
          //       //proceed with logic by disabling the related features or quit the app. 
         } 
        } 
       } 
      } 
     } 

    } 

    private void showDialogOK(String message, DialogInterface.OnClickListener okListener) { 
     new AlertDialog.Builder(this) 
       .setMessage(message) 
       .setPositiveButton("OK", okListener) 
       .setNegativeButton("Cancel", okListener) 
       .create() 
       .show(); 
    }