7

I am getting below error when running app on API 16.

 java.lang.RuntimeException: Unable to start activity ComponentInfo{}: java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -4
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
                      at android.app.ActivityThread.access$600(ActivityThread.java:130)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:137)
                      at android.app.ActivityThread.main(ActivityThread.java:4745)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:511)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                      at dalvik.system.NativeStart.main(Native Method)
                   Caused by: java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -4
                      at android.media.audiofx.Visualizer.<init>(Visualizer.java:199)
                      at xyz.activity.AudioPreviewActivity.setupVisualizerFxAndUI(AudioPreviewActivity.java:83)
                      at xyz.activity.AudioPreviewActivity.initAudio(AudioPreviewActivity.java:60)
                      at xyz.activity.AudioPreviewActivity.onCreate(AudioPreviewActivity.java:40)
                      at android.app.Activity.performCreate(Activity.java:5008)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
                      at android.app.ActivityThread.access$600(ActivityThread.java:130) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:137) 
                      at android.app.ActivityThread.main(ActivityThread.java:4745) 
                      at java.lang.reflect.Method.invokeNative(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:511) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                      at dalvik.system.NativeStart.main(Native Method)   

Error line-

mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());

Code

private void setupVisualizerFxAndUI() {

    mMediaPlayer = MediaPlayer.create(this, Uri.parse(filePath));
    mMediaPlayer
            .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mVisualizer.setEnabled(false);
                }
            });

    mMediaPlayer.start();
    mMediaPlayer.setLooping(true);
    mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
    mVisualizer.setDataCaptureListener(
                    new Visualizer.OnDataCaptureListener() {
                        public void onWaveFormDataCapture(Visualizer visualizer,
                                                          byte[] bytes, int samplingRate) {
                            mVisualizerView.updateVisualizer(bytes);
                        }

                        public void onFftDataCapture(Visualizer visualizer,
                                                     byte[] bytes, int samplingRate) {
                        }
                    }, Visualizer.getMaxCaptureRate() / 2, true, false);
        }

I already have added below permissions in manifest-

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
Android Developer
  • 9,157
  • 18
  • 82
  • 139

4 Answers4

3

-4 Means you gave a bad parameter. Although getAudioSessionId can be called in any state, have you called prepare and start on the MediaPlayer you are using, to ensure it has a good state before attempting to visualise?

You may also need to add the android.permission.RECORD_AUDIO permission when using the Visualiser this way and android.permission.INTERNET if the audio source isn't local

Nick Cardoso
  • 20,807
  • 14
  • 73
  • 124
3

Add a runtime permission for api 23 and above.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

            int hasAudioPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
            int hasInternetPermission = checkSelfPermission(Manifest.permission.INTERNET);

            List<String> permissions = new ArrayList<>();


      if (hasAudioPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.RECORD_AUDIO);
            }

            if (hasInternetPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.INTERNET);
            }

            if (!permissions.isEmpty()) {
                requestPermissions(permissions.toArray(new String[permissions.size()]), PERMISSION);
            }
        }
Tandoh Anthony Nwi-Ackah
  • 2,135
  • 2
  • 16
  • 30
1

It is likely you have something bad in the configuration of the Visualizer, double check the content in your setupVisualizer method. Please refer to similar issue.

Community
  • 1
  • 1
Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
1

Late answer, but still.

The problem has nothing to do with permissions, as you stated, you targeted API 16 and you added permissions in your manifest, so A.N.T's answer doesn't even make sense.

The problem is that you are calling the Visualizer before MediaPlayer is prepared.


You can fix this by calling it after mMediaPlayer is prepared, like this:

private void setupMediaPlayer(String filePath) {

    mMediaPlayer = MediaPlayer.create(this, Uri.parse(filePath));

    //Check when MediaPlayer is completed
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
        public void onCompletion(MediaPlayer mediaPlayer) {
            mVisualizer.setEnabled(false);
        }
    });

    //Check when MediaPlayer is prepared
    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            //MediaPlayer is prepared and playback can now start
            startPlaying();

        }
    });

}

Once mMediaPlayer is prepared:

private void startPlaying() {
    mMediaPlayer.start();
    mMediaPlayer.setLooping(true);
    //Now we can call the Visualizer
    createVisualizer();
}

Then you can call Visualizer like this:

private void createVisualizer() {
    mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
    mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
        @Override
        public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
            mVisualizerView.updateVisualizer(bytes);
        }

        public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
            //Do something you like
        }

    }, Visualizer.getMaxCaptureRate() / 2, true, false);

}
HB.
  • 4,116
  • 4
  • 29
  • 53