6

Sto provando a registrare l'audio in una delle mie attività utilizzando MediaRecorder. Una parte del codice è mostrata sotto.java.lang.RuntimeException: avvio non riuscito

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

Ho dato le seguenti autorizzazioni nel file manifest.

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

ma allo recorder.start linea() io sono sempre l'eccezione di runtime. Logcat mostra i seguenti messaggi di errore.

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) 

Ha provato le domande corrispondenti all'errore nello stackoverflow ma non è in grado di concludere una risposta valida da esse. Si prega di controllare questo e aiutarmi che sta andando male nel codice.

FYI> questo pezzo di codice non funziona solo con dispositivi specifici. Mi mancano ulteriori autorizzazioni?

+0

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

+0

@MysticMagic Sto cercando per la registrazione audio che non sento nulla a che fare con la larghezza e l'altezza. La risposta che hai eliminato è per la registrazione video :) – Jeeri

+1

_questo pezzo di codice non riesce in solo dispositivi specifici_ - potresti voler includere più dettagli su tali dispositivi. Come, qual è la versione della piattaforma su di loro? 'AudioEncoder.AMR_WB' è disponibile solo da API10. – ozbek

risposta

3

Pochi dispositivi non supportano perché non supportano il formato 3GP e la codifica AudioEncoder.AMR_WB. Fai clic su here per verificare i formati supportati.

Si prega di utilizzare sotto il codice che supporterà il numero massimo di dispositivi.

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

Che ne dici di Android 2.2? –

+1

Che cosa è su Android M? –

+1

Lo renderà Funzionante come predefinito per ogni dispositivo? .come sotto recorder.setOutputFormat (OutputFormat.DEFAULT) ; recorder.setAudioEncoder (AudioEncoder.DEFAULT); – SimpleCoder

0

Se si utilizza Api 23 poi fare il permesso concesso prima poi avviare la registrazione

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