Android Visualizer 错误仅在 Android 6.0 中
Android Visualizer error only in 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();
}
}
如有任何帮助,我们将不胜感激。提前致谢 =)
您能否尝试在您的清单文件中添加到您的权限列表:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
也许底层组件需要一些在 6.0 中不会自动授予的权限。转到此应用的 AppInfo;导航到权限;确保已授予此应用请求的所有权限。
确保您在清单中拥有此权限,因为可视化工具需要它。
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
由于此权限是 'dangerous' 您还需要要求用户在运行时授予权限。
这让我发疯了几个星期...我专注于我的 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);
}
我发现了一个与 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();
}
}
如有任何帮助,我们将不胜感激。提前致谢 =)
您能否尝试在您的清单文件中添加到您的权限列表:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
也许底层组件需要一些在 6.0 中不会自动授予的权限。转到此应用的 AppInfo;导航到权限;确保已授予此应用请求的所有权限。
确保您在清单中拥有此权限,因为可视化工具需要它。
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
由于此权限是 'dangerous' 您还需要要求用户在运行时授予权限。
这让我发疯了几个星期...我专注于我的 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);
}