나는 오디오 출력을 듣고, FFT (visualizer API에서 처리)를 생성하고, 약간의 수학을 수행하고, 정보를 무선으로 전송하여 표시하도록하는 간단한 비주얼 라이저 응용 프로그램을 만들고 있습니다. Oneplus3에서 Android 8.0에서 Visualizer API를 실행하는 데 문제가 있지만 시뮬레이트 된 Android 6.0 & 8.0 휴대 전화에서 정상적으로 작동합니다.Android 시각화 사용 권한 오류
<manifest>
<application>
...rest of application...
</application>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>
다음 내가 런타임에 어떤 권한을 요청 :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextMessage = (TextView) findViewById(R.id.message);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
if (ContextCompat.checkSelfPermission(getApplicationContext(), permission.MODIFY_AUDIO_SETTINGS) == PackageManager.PERMISSION_DENIED)
Log.d("App", "No MODIFY_AUDIO_SETTINGS");
else
Log.d("App", "Yes MODIFY_AUDIO_SETTINGS");
if (ContextCompat.checkSelfPermission(getApplicationContext(), permission.RECORD_AUDIO) == PackageManager.PERMISSION_DENIED)
Log.d("App", "No RECORD_AUDIO");
else
Log.d("App", "Yes RECORD_AUDIO");
Log.d("App","Requesting permissions");
ActivityCompat.requestPermissions(this, new String[]
{
permission.MODIFY_AUDIO_SETTINGS,
permission.RECORD_AUDIO
},1);
Log.d("App","Requested perms");
}
나는이 현재 허가를 인쇄한다고 생각 여기
내가 먼저 매니페스트에, 내가 필요 믿고 사용 권한을 요청하는 방법 그런 다음 필요한 모든 권한을 요청하십시오. 새로 설치하면 RECORD_AUDIO에 대한 프롬프트가 표시됩니다 (MODIFY_AUDIO_SETTINGS은 위험한 권한이 아니며 자동으로 부여 된 것 같습니다). 비동기 적으로,이 호출된다 : 안드로이드 8.0에
public void onRequestPermissionsResult (int requestCode,
String[] permissions,
int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean success = true;
for(int i = 0; i < permissions.length; ++i) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Log.d("App",permissions[i]+" granted");
} else {
Log.d("App",permissions[i]+" denied");
Toast.makeText(getApplicationContext(), "Needed " + permissions[i], Toast.LENGTH_SHORT).show();
success = false;
}
}
if(success) {
Log.d("App","Setting up visualizer");
}
}
이 로그는 우리가 모두 권한을 가지고, 우리는 어쨌든을 요청하는 경우, 그들은 부여하고 있음을 보여준다. 우리는 실행에 조금 나중에받을 때
D/App: Yes MODIFY_AUDIO_SETTINGS
D/App: Yes RECORD_AUDIO
D/App: Requesting permissions
D/App: Requested perms
D/AppTracker: App Event: start
D/OpenGLRenderer: HWUI GL Pipeline
D/AppTracker: App Event: stop
I/Adreno: QUALCOMM build : 08cdca0, I5f270ba9bc
Build Date : 09/18/17
OpenGL ES Shader Compiler Version: EV031.20.00.04
Local Branch :
Remote Branch : refs/tags/AU_LINUX_ANDROID_LA.UM.6.5.R1.08.00.00.312.025
Remote Branch : NONE
Reconstruct Branch : NOTHING
I/vndksupport: sphal namespace is not configured for this process. Loading /vendor/lib64/hw/gralloc.msm8996.so from the current namespace instead.
I/Adreno: PFP: 0x005ff087, ME: 0x005ff063
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 2
D/App: android.permission.MODIFY_AUDIO_SETTINGS granted
D/App: android.permission.RECORD_AUDIO granted
D/App: Setting up visualizer
D/AppTracker: App Event: start
I/vndksupport: sphal namespace is not configured for this process. Loading /vendor/lib64/hw/gralloc.msm8996.so from the current namespace instead.
E/AudioEffect: set(): AudioFlinger could not create effect, status: -1
E/visualizers-JNI: Visualizer initCheck failed -3
E/Visualizer-JAVA: Error code -3 when initializing Visualizer.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: net.rsaxvc.blequalizer, PID: 15981
java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -3
at android.media.audiofx.Visualizer.<init>(Visualizer.java:218)
at net.rsaxvc.blequalizer.MainActivity.setupVisualizerFxAndUI(MainActivity.java:133)
at net.rsaxvc.blequalizer.MainActivity.access$000(MainActivity.java:22)
at net.rsaxvc.blequalizer.MainActivity$1.onNavigationItemSelected(MainActivity.java:63)
at android.support.design.widget.BottomNavigationView$1.onMenuItemSelected(BottomNavigationView.java:182)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
at android.support.design.internal.BottomNavigationMenuView$1.onClick(BottomNavigationMenuView.java:95)
at android.view.View.performClick(View.java:6289)
at android.view.View$PerformClick.run(View.java:24800)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6809)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
D/AppTracker: App Event: crash
Application terminated.
이
mVisualizer = new Visualizer(0);
를 호출 할 때, (시각화 도우미를 시작하는 것은 현재 버튼을 눌러 연결되어 있습니다) 우리는 다음을 참조하십시오 "E/AudioEffect을 : 설정() : AudioFlinger는 media/libmedia/AudioEffect.cpp에서 status : -1 "을 만들지 못했습니다. audioFlinger-> createEffect가 실패하고 -1/PERFORMANCE_DENIED 인 -1을 반환합니다. 서비스/audioflinger/AudioFlinger의 다음 코드로 인해. cpp :
// check audio settings permission for global effects
if (sessionId == AUDIO_SESSION_OUTPUT_MIX && !settingsAllowed()) {
lStatus = PERMISSION_DENIED;
goto Exit;
}
libs와/audioflinger/AudioFlinger.cpp에서 617,451,515,
이 :
static bool settingsAllowed() {
#ifndef HAVE_ANDROID_OS
return true;
#endif
#if AUDIOFLINGER_SECURITY_ENABLED
if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
bool ok = checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"));
if (!ok) LOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
return ok;
#else
if (!checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS")))
LOGW("WARNING: Need to add android.permission.MODIFY_AUDIO_SETTINGS to manifest");
return true;
#endif
}
내 생각 엔 네이티브 코드가 자바 코드가 보는 같은 권한을 받고되지 않는 것입니다. 또는 네이티브 코드가 응용 프로그램 자체와 다른 프로세스로 실행 중입니다.
이것은 앱이 런타임 권한을 묻지 않고 Android Visualizer error only in Android 6.0과 다른 것으로 보입니다.