J'ai le firmware Android G1 1.6, j'essaie d'enregistrer de la voix à partir de l'application avec le code suivant.
MediaRecorder recorder = new MediaRecorder (); recorder.setAudioSource (MediaRecorder.AudioSource.MIC); recorder.setOutputFormat (MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder (MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile (PATH_NAME); recorder.prepare (); recorder.start ();
mon manifeste.xml a:
<utilise-permission Android: name = "Android.permission.RECORD_AUDIO" />
J'ai eu:
09-23 14: 41: 05.531: ERREUR/AndroidRuntime (1718): Gestionnaire non capturé: sortie principale du fil en raison d'une exception non interceptée 09-23 14: 41: 05,551: ERREUR/AndroidRuntime (1718): Java. lang.RuntimeException: setAudioSource a échoué le ........ 09-23 14: 41: 05.551: ERREUR/AndroidRuntime (1718): sur Android.media.MediaRecorder.setAudioSource (Méthode native)
comment enregistrer la voix correctement?
Ouvrez "AndroidManifest.xml
" ->
ajouter
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
Je sais que la question est très ancienne, mais sous Android Marshmallow, vous devez accéder à "Paramètres> Applications> Votre application> Autorisations" et activer l'autorisation Microphone.
Si vous utilisez Android M, vous devez demander des autorisations pour enregistrer le son lors de la première exécution. Pour ce faire, demandez à l'utilisateur si vous pouvez enregistrer de l'audio au démarrage de l'application:
private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 29;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (mContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO},
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
} else {
Log.d("Home", "Already granted access");
initializeView(v);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("Home", "Permission Granted");
initializeView(v);
} else {
Log.d("Home", "Permission Failed");
Toast.makeText(getActivity().getBaseContext(), "You must allow permission record audio to your mobile device.", Toast.LENGTH_SHORT).show();
getActivity().finish();
}
}
// Add additional cases for other permissions you may have asked for
}
}
J'ai eu ce problème exact, cela l'a résolu pour moi:
Sur le périphérique que vous utilisez pour le débogage, accédez à Paramètres -> Applications -> {votre application} . Assurez-vous ensuite que toutes les autorisations de l'application (dans ce cas, l'enregistrement audio et l'écriture de stockage externe) sont autorisées.
Lorsque vous installez une application sans passer par le Google Play Store, vous n'êtes pas invité à accorder des autorisations. Sur certains téléphones, cela signifie que votre application de débogage ne reçoit pas certaines autorisations.
Vérifiez cela même si certaines autorisations du fichier manifeste sont reconnues (telles que l'accès Internet), car pour moi certaines ont fonctionné et d'autres ont été automatiquement bloquées.
J'espère que cela t'aides.
IMPORTANT - Au cours des dernières heures, j’ai essayé de comprendre comment vérifier si le MIC était capturé par une application différente ou non. J'ai remarqué que si 2 adresses d'application sur MediaRecorder simultanément, une exception RuntimeException sera lancée et vous ne pourrez plus utiliser le micro, à moins de redémarrer votre appareil (!!) La meilleure solution, mais cela a fonctionné pour moi ... peut-être que cela vous fera économiser quelques heures un jour ...
private void validateMicAvailability() throws MicUnaccessibleException {
AudioRecord recorder =
new AudioRecord(AudioSource.MIC, 44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_DEFAULT, 44100);
try{
if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
throw new MicUnaccessibleException("Mic didn't successfully initialized");
}
recorder.startRecording();
if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
recorder.stop();
throw new MicUnaccessibleException("Mic is in use and can't be accessed");
}
recorder.stop();
} finally{
recorder.release();
recorder = null;
}
}
Veuillez demander la permission Manifest.permission.RECORD_AUDIO
de manière dynamique pour Marshmallow et les versions supérieures.
Pour l'API 23+, vérifiez l'autorisation d'enregistrement audio dans Manifest.xml <uses-permission Android:name="Android.permission.RECORD_AUDIO" />
et dans Java Code
if (ActivityCompat.checkSelfPermission(cnt, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(cnt, arrayOf(
Manifest.permission.RECORD_AUDIO
),0)
return
}
Pour l'API 23+, vous devez demander les autorisations de lecture/écriture, même si elles figurent déjà dans votre manifeste.
// Check for permissions
int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
// If we don't have permissions, ask user for permissions
if (permission != PackageManager.PERMISSION_GRANTED) {
String[] PERMISSIONS_STORAGE = {
Android.Manifest.permission.READ_EXTERNAL_STORAGE,
Android.Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int REQUEST_EXTERNAL_STORAGE = 1;
ActivityCompat.requestPermissions(
getActivity(),
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
Cela semble correct. Assurez-vous que d'autres applications n'utilisent pas déjà le MIC. Peut-être redémarrer le téléphone et réessayer.
Ce code a fonctionné pour moi
mRecorder = new MediaRecorder();
mRecorder.reset();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
essayez ce code il vous aide beaucoup et son compréhensible .....
public class MainActivity extends Activity {
MediaRecorder mRecorder;
MediaPlayer mediaPlayer;
Button start, stop, play,stop_play;
String FileName="";
File outfile ;
public static final int request_code = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start=(Button)findViewById(R.id.btn_start_main);
stop=(Button)findViewById(R.id.btn_stop_main);
play=(Button)findViewById(R.id.btn_play_main);
stop_play=(Button)findViewById(R.id.btn_playstop_main);
if (checkPermissionFromDevice()){
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FileName= Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+
UUID.randomUUID()+"AudioFile.3gp";
SetupMediaRecorder();
try {
mRecorder.prepare();
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
start.setEnabled(false);
stop.setEnabled(true);
play.setEnabled(false);
stop_play.setEnabled(false);
Toast.makeText(getApplicationContext(),"recording....",Toast.LENGTH_SHORT).show();
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecorder.stop();
play.setEnabled(true);
start.setEnabled(true);
stop.setEnabled(false);
stop_play.setEnabled(false);
Toast.makeText(getApplicationContext(),"recording stoped....",Toast.LENGTH_SHORT).show();
}
});
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer=new MediaPlayer();
try {
mediaPlayer.setDataSource(FileName);
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
start.setEnabled(false);
stop.setEnabled(false);
play.setEnabled(false);
stop_play.setEnabled(true);
Toast.makeText(getApplicationContext(),"playing..",Toast.LENGTH_SHORT).show();
}
});
stop_play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
SetupMediaRecorder();
start.setEnabled(true);
stop_play.setEnabled(false);
play.setEnabled(false);
}
});
}
else {
requestPermissionFromDevice();
}
}
private void SetupMediaRecorder() {
mRecorder=new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(FileName);
}
private void requestPermissionFromDevice() {
ActivityCompat.requestPermissions(this,new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO},
request_code);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case request_code:
{
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ){
Toast.makeText(getApplicationContext(),"permission granted...",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(),"permission denied...",Toast.LENGTH_SHORT).show();
}
}
break;
}
}
private boolean checkPermissionFromDevice() {
int storage_permission= ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
int recorder_permssion=ContextCompat.checkSelfPermission(this,Manifest.permission.RECORD_AUDIO);
return storage_permission == PackageManager.PERMISSION_GRANTED && recorder_permssion == PackageManager.PERMISSION_GRANTED;
}
}
Ma suggestion peut paraître stupide, mais elle a fonctionné pour moi :)
Essayez de donner la permission en tant que balise imbriquée. Je crois qu’il existe un problème d’analyse XML quelque part .__ avec la bibliothèque de packages Android.
En tant qu’utilisateur de CyanogenMod, j’ai dû
Settings
-> Apps
-> Sélectionnez votre application -> Permissions
-> Vérifiez toutes les autorisations (celles-ci doivent être celles demandées par le manifeste)Après cela, le recodage a fonctionné pour moi.
Je l'ai déplacé vers un autre thread. Tout fonctionne.
Voici un code:
new Thread(() -> {
mediaRecorder.reset();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile("/audiorecordtest.3gp");
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mediaRecorder.prepare();
mediaRecorder.start();
//do something here
mediaRecorder.stop();
} catch (IOException e) {
e.printStackTrace();
Log.d("Audio","unable to prepare");
}
}).start();