2017-11-28 3 views
0

나는 오디오 출력을 듣고, 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과 다른 것으로 보입니다.

답변

0

이 앱을 개발하는 과정 중 일부는 Android 8.0으로 업데이트되었습니다. AFAICT, 뭔가 망 쳤어. 마지막으로 앱을 제거하고 다시 설치하면 문제가 해결되었습니다.