android - read_external_storage - react native write_external_storage permission




android.view.WindowManager $ BadTokenException:창을 추가 할 수 없습니다 [email protected]권한이 거부되었습니다. (2)

SYSTEM_ALERT_WINDOW 권한을 확인하거나 수동으로 오버레이 권한을 제공하십시오.

@Fco P.는 당신이

mRedBoxDialog.getWindow (). setType (WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

** ## Lenovo 장치를 사용하는 경우. 다른 것을 시도하십시오. 이 특별한 권한은 Lenovo 장치에서 언젠가는 문제가됩니다. ****

다음은 스택 추적입니다.

01-30 15:11:41.037 13010-13010/project.app E/AndroidRuntime: FATAL EXCEPTION: main
 Process: project.app, PID: 13010
 android.view.WindowManager$BadTokenException:
   Unable to add window android.view.[email protected] -- permission denied for window type 2003
   at android.view.ViewRootImpl.setView(ViewRootImpl.java:789)
   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
   at android.app.Dialog.show(Dialog.java:330)
   at com.facebook.react.devsupport.DevSupportManagerImpl$4.run(DevSupportManagerImpl.java:344)
   at android.os.Handler.handleCallback(Handler.java:790)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:164)
   at android.app.ActivityThread.main(ActivityThread.java:6494)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

나는 TYPE_SYSTEM_ERROR 에 대한 답변이 Android Oreo (8)에서 더 이상 사용되지 않으므로 다음과 같은 메소드도 구현했습니다.

public void fixAndroid() {
    WindowManager.LayoutParams params;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      params = new WindowManager.LayoutParams(
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
              WindowManager.LayoutParams.FLAG_FULLSCREEN,
              PixelFormat.TRANSLUCENT);
    } else {
      params = new WindowManager.LayoutParams(
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
              WindowManager.LayoutParams.FLAG_FULLSCREEN,
              PixelFormat.TRANSLUCENT);
    }
  }

onCreate() 메소드 내부에는 다음과 같은 onCreate() 있습니다.

  @Override
  public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Checking permissions on init
    fixAndroid();
  }

나는 여전히 오류가 발생합니다.

엑스포 SDK 21, React Native 0.48을 사용 중입니다. 신청서가 ExpoKit으로 분리되었습니다.

각 변경 후 내 프로젝트를 청소 한 다음 Android Studio를 통해 에뮬레이터에서 실행합니다.

편집 : API 27에서 실행되는 Nexus 5X 에뮬레이터에서이 광고를 게재하고 있습니다.


얼마 전에이 오류를 보았습니다. SDK 26에 대한 네이티브 및 리액션 응용 프로그램을 업데이트했습니다. 문제는 개발을 위해 빨간색 대화 상자를 만드는 반응 - 네이티브 함수입니다. 이 함수는 해당 유형으로 TYPE_SYSTEM_ALERT를 사용하므로 더 이상 TYPE_SYSTEM_ALERT를 사용하지 않도록 해당 함수를 패치하지 않는 한 해당 버전의 hybrid와 함께 하이브리드 앱에서 25보다 큰 SDK 레벨을 사용할 수 없습니다.

이것은 0.48의 반응 네이티브 코드입니다.

private void showNewError(
      final String message,
      final StackFrame[] stack,
      final int errorCookie,
      final ErrorType errorType) {
    UiThreadUtil.runOnUiThread(
        new Runnable() {
          @Override
          public void run() {
            if (mRedBoxDialog == null) {
              mRedBoxDialog = new RedBoxDialog(mApplicationContext, DevSupportManagerImpl.this, mRedBoxHandler);
              mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }
            if (mRedBoxDialog.isShowing()) {
              // Sometimes errors cause multiple errors to be thrown in JS in quick succession. Only
              // show the first and most actionable one.
              return;
            }
            mRedBoxDialog.setExceptionDetails(message, stack);
            updateLastErrorInfo(message, stack, errorCookie, errorType);
            // Only report native errors here. JS errors are reported
            // inside {@link #updateJSError} after source mapping.
            if (mRedBoxHandler != null && errorType == ErrorType.NATIVE) {
              mRedBoxHandler.handleRedbox(message, stack, RedBoxHandler.ErrorType.NATIVE);
              mRedBoxDialog.resetReporting(true);
            } else {
              mRedBoxDialog.resetReporting(false);
            }
            mRedBoxDialog.show();
          }
        });
  } 

mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 를 변경해야합니다 mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 다른 유형의 전화. 그러나 이것은 SDK 26을 사용하여 앱을 실행할 수 있다는 보장을 제공하지 않습니다. SDK 26과의 반응을 컴파일 할 때 "반응 한"프로젝트의 다른 부분이 폭발하기 때문에 짧은 시간에 작동하지 않을 것입니다. (다른 문제를 해결해야 할 수도 있음). 그래서 귀하의 옵션은 다음과 같습니다 :

- 앱을 레벨 25로 내려받습니다.

- 그 기능이 더 이상 존재하지 않는 0.52에 반응하도록 업그레이드하고 다시 시도하십시오 (반응 라이브러리가이 후에 작동하지 않을 수도 있음)

반응 고유의 0.48 분기에서 기능을 패치하고 패치 버전을 시도하십시오. SDK와 관련된 몇 가지 다른 문제가 발생할 수 있습니다 (이 시점에서 아직 SDK 22로 컴파일 중입니다)

해피 코딩!





android-permissions