0

I am trying to get information about my phone's microphone through the MicrophoneInfo library in android studio, but when I use a simple method that returns an integer like getId() or getLocation()... I get the following error....

error

My code is the following...

package com.example.mi_microfono;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.media.AudioDeviceInfo;
import android.media.MicrophoneInfo.Coordinate3F;
import android.media.MicrophoneInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.TextView;

import java.io.IOException;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private MicrophoneInfo miMicrofono;
    private TextView infoMicrofono;
    private MediaRecorder grabacion;
    private String archivoSalida = null;
    private AudioDeviceInfo micMic;


    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1000);
        }

        infoMicrofono = (TextView) findViewById(R.id.infoMicro);


        configMicro();


    }

    public void configMicro(){

        if (grabacion==null){

            archivoSalida = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/grabacion5.mp3";
            grabacion = new MediaRecorder();
            grabacion.setAudioSource(MediaRecorder.AudioSource.MIC);
            grabacion.setAudioSamplingRate(44100);
            grabacion.setAudioEncodingBitRate(96000);
            grabacion.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            grabacion.setOutputFile(archivoSalida);
            grabacion.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB );
        }

        try{
            grabacion.prepare();
            grabacion.start();


        }catch (IOException e){

            String mensajeError = e.getMessage();
            //mensaje.setText(mensajeError);

        }
    }

    @RequiresApi(api = Build.VERSION_CODES.P)
    public void dataMicro(View view){

        int data;
        try {

            data = miMicrofono.getId();

            infoMicrofono.setText("Locación: " + data);

        }catch (NullPointerException e){

            infoMicrofono.setText("error: " + e);
        }

        grabacion.stop();

    }

}

After doing what I described before, I want to use the getFrequencyResponse() method, to get the frequency of the audio detected live by my phone's microphone, I want to detect the frequency directly without having to record and/or play an audio.

Please, could someone help me?

  • Nowhere in your code do you assign anything to `miMicrofono`. So it is `null`. So you get an NPE when you attempt to use it. – Stephen C Jun 24 '22 at 02:00
  • P.S. You can get your device's microphones using `AudioManager.getMicrophones()`. It returns a `List`. – Stephen C Jun 24 '22 at 04:36

0 Answers0