Ошибка Android Visualizer только в Android 6.0

я обнаружил одну проблему, связанную с Visualizer, которая возникает только на устройствах Android 6.0. Не знаю, почему это происходит, поэтому любая помощь будет оценена по достоинству. Вот стек ошибок:

AudioEffect: set(): AudioFlinger could not create effect, status: -1
visualizers-JNI: Visualizer initCheck failed -3
Visualizer-JAVA: Error code -3 when initializing Visualizer.
java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -3
System.err: at android.media.audiofx.Visualizer.<init>(Visualizer.java:218)
System.err:     at com.xxx.xxxx.customviews.visualizer.VisualizerView.link(VisualizerView.java:101)

и вот код, который вызывает это:

public void link(MediaPlayer player) {

    if (player == null) {

        throw new NullPointerException("Cannot link to null MediaPlayer");
    }

    Equalizer mEqualizer = new Equalizer(0, player.getAudioSessionId());
    mEqualizer.setEnabled(true); // need to enable equalizer


    try {

        int aud = player.getAudioSessionId();
        **mVisualizer = new Visualizer(aud);**
        mVisualizer.setEnabled(false);
        mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
        Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener() {

            @Override
            public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
                updateVisualizer(bytes);
            }

            @Override
            public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
                updateVisualizerFFT(bytes);
            }
        };

        mVisualizer.setDataCaptureListener(captureListener, Visualizer.getMaxCaptureRate() / 2, true, true);
        mVisualizer.setEnabled(true);
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mVisualizer.setEnabled(false);
            }
        });
    }catch(Exception e) {       

        e.printStackTrace();        
    } 
}

Любая помощь будет оценена по достоинству. Заранее спасибо =)


person Luciano Rodríguez    schedule 03.11.2015    source источник


Ответы (4)


Возможно, базовому компоненту (компонентам) нужны некоторые разрешения, которые не предоставляются автоматически в версии 6.0. Перейти к AppInfo для этого приложения; перейти к разрешениям; убедитесь, что все разрешения, запрошенные этим приложением, предоставлены.

person Harkish    schedule 03.11.2015
comment
Это правильный ответ. Я до сих пор не знаком с новой системой разрешений. Спасибо =) - person Luciano Rodríguez; 03.11.2015
comment
Также, пожалуйста, ознакомьтесь с документом, запрашивающим разрешения во время выполнения на сайте developer.android.com, чтобы понять, как обращаться с разрешениями в M. - person Harkish; 03.11.2015
comment
Это то, что я сделал. Еще раз спасибо =) - person Luciano Rodríguez; 03.11.2015
comment
Как мне перейти к AppInfo? - person JellicleCat; 19.10.2016
comment
@JellicleCat: нажмите и удерживайте значок приложения и контекстные меню «Информация о приложении» и «Удалить». - person Harkish; 20.10.2016

Убедитесь, что у вас есть это разрешение в вашем манифесте, так как оно требуется визуализатору.

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

Поскольку это разрешение «опасно», вам также необходимо попросить пользователя предоставить разрешение во время выполнения.

person phxhawke    schedule 04.11.2015

Можете ли вы попробовать добавить в свой список разрешений в файле манифеста:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
person screspo    schedule 03.11.2015

Это сводило меня с ума в течение нескольких недель... Я сосредоточился на своем коде Visualizer, где проблема заключалась в системе разрешений 6.0. Я тестировал это на 4.2.2, 5.0 и 6.0.1 на реальных устройствах. Я до сих пор не знаю, почему диалоговое окно разрешения никогда не появляется, когда я тестирую приложение на реальных устройствах. Кроме того, ручное включение разрешения Microphone решило проблему в настройках информации о приложении.

if (ActivityCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED)
                 {
                     requestPermissions(new String[]{android.Manifest.permission.RECORD_AUDIO}, 1);
        }
person midiwriter    schedule 28.06.2016