Android Visualizer仅在Android 6.0中出错

时间:2015-11-03 08:39:42

标签: android android-mediaplayer visualizer

我发现一个与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();        
    } 
}

任何帮助将不胜感激。在此先感谢=)

4 个答案:

答案 0 :(得分:5)

可能底层组件需要一些不会在6.0中自动获得授权的权限。转到这个应用程序的AppInfo;导航到权限;确保已授予此应用已请求的所有权限。

答案 1 :(得分:1)

确保您在Manifest中拥有此权限,因为Visualizer需要它。

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

由于此权限是“危险的”,您还需要要求用户在运行时授予权限。

答案 2 :(得分:0)

您可以尝试在清单文件中添加您的权限列表:

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

答案 3 :(得分:0)

这让我疯狂了好几周......我专注于我的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);
        }