6

MediaRecorder kullanarak Etkinliklerimden birinde ses kaydetmeye çalışıyorum. Kodun bir kısmı aşağıda gösterilmiştir.java.lang.RuntimeException: başlatılamadı

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()); 
} 

Bildirim dosyasında aşağıdaki izinleri verdim.

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

ama hat recorder.start() Ben çalışma zamanı özel alıyorum at

. Logcat, aşağıdaki hata iletilerini gösterir.

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) 

Yığınlama akışındaki hataya karşılık gelen ancak bunlardan geçerli bir yanıt alamayan soruları denedim. Lütfen bunu kontrol edin ve kodda yanlış olanlara yardım edin.

Bilginize> bu kod parçası sadece belirli cihazlar başarısız. Ek izinleri kaçırıyor muyum? onlar 3GP formatını yanı sıra AudioEncoder.AMR_WB kodlamasını desteklemediğinden cihazların

+0

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

+0

@MysticMagic ben ses kaydı arıyorum hangi genişlik ve yükseklik ile ilgili hiçbir şey hissetmiyorum. Bahsettiğiniz cevap video kaydı içindir :) – Jeeri

+1

_Bu parça sadece belirli cihazlarda başarısız oluyor - bu cihazlar hakkında daha fazla ayrıntı eklemek isteyebilirsiniz. Onlarda platform versiyonu nedir? AudioEncoder.AMR_WB' yalnızca API10’dan kullanılabilir. – ozbek

cevap

3

Az destek değildir. Desteklenen biçimleri kontrol etmek için here'a tıklayın.

cihazların maksimum sayıda destek verecek kod aşağıda kullanın.

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

Nasıl android 2.2 hakkında? –

+1

android M hakkında ne var? –

+1

Yapacağız her cihaz için varsayılan çalışma? Gibi kaydeder.setOutputFormat (OutputFormat.DEFAULT) gibi recorder.setAudioEncoder (AudioEncoder.DEFAULT); – SimpleCoder

0

sonra verilen izin yapmak Api 23 kullanıyorsanız ilk sonra kaydetmeye başlamak

 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(); 
    } 
İlgili konular