0

배경

에 액세스 할 때 FileUriExposedException 처리 :안드로이드 7.0 마이그레이션 - 안드로이드 내 웹보기에서 다음 URL을로드 할 때 내 응용 프로그램이 <code>FileUriExposedException</code>와 충돌 알게되었다 7.0으로 마이그레이션 한 후 android_asset 폴더

webView.loadUrl("file:///android_asset/myFolder/myFile.html") 

내가 읽은 here은 Android 7.0에서 도입 된 파일 시스템 권한 변경으로 인해 발생합니다. 여기서 FileUriExposedException은 인 텐트의 file : // Uri를 공유하려고 할 때 throw됩니다.

내가 임시 액세스 권한 ( here)에 대한 FileProvider를 사용하는이었다 주위에 제안 된 작업을 구현하기 위해 노력했지만 난 단지 사용 가능한 경로를 볼로 나는 android_asset 폴더에 대해이 작업을 할 수있는 방법을 모른다 FileProvider의 경우 내부 및 외부 저장 경로가 필요합니다. HelpActivity에서>

Intent intent = new Intent(view.getContext(), HelpActivity.class); 
    startActivity(intent); 

- - MainActivity에서

코드

>

webView.loadUrl("file:///android_asset/help/index.html"); 

질문

사람을 필요로 할 때이 예외 주위에 얻을 수있는 좋은 방법을 알고 있나요 WebView의 assets 폴더에서 파일을로드 하시겠습니까?

android.os.FileUriExposedException: file:///android_asset/help/help.html exposed beyond app through Intent.getData() 
     at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958) 
     at android.net.Uri.checkFileUriExposed(Uri.java:2348) 
     at android.content.Intent.prepareToLeaveProcess(Intent.java:9766) 
     at android.content.Intent.prepareToLeaveProcess(Intent.java:9720) 
     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1609) 
     at android.app.Activity.startActivityForResult(Activity.java:4472) 
     at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 
     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 
     at android.app.Activity.startActivityForResult(Activity.java:4430) 
     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
     at android.app.Activity.startActivity(Activity.java:4791) 
     at android.app.Activity.startActivity(Activity.java:4759) 
     at android.content.ContextWrapper.startActivity(ContextWrapper.java:366) 
     at org.chromium.android_webview.ResourcesContextWrapperFactory$WebViewContextWrapper.startActivity(ResourcesContextWrapperFactory.java:118) 
     at org.chromium.android_webview.AwContentsClient.sendBrowsingIntent(AwContentsClient.java:203) 
     at org.chromium.android_webview.AwContentsClient.shouldIgnoreNavigation(AwContentsClient.java:170) 
     at org.chromium.android_webview.AwContentsClientBridge.shouldOverrideUrlLoading(AwContentsClientBridge.java:352) 
     at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
     at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:41) 
     at android.os.Handler.dispatchMessage(Handler.java:105) 
     at android.os.Looper.loop(Looper.java:164) 
     at android.app.ActivityThread.main(ActivityThread.java:6541) 
     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) 
+2

"Android 7.0으로 마이그레이션 한 후 내 webView에 다음 URL을로드 할 때 내 앱이 FileUriExposedException을 사용하여 충돌하는 것으로 나타났습니다."- 심각하게 말하면? 전체 Java 스택 추적을 게시 할 수 있습니까? – CommonsWare

+0

@CommonsWare 죄송합니다. 죄송합니다. 추가했습니다. – Lauren

+0

stacktrace는 startActivity()가 사용하는 인 텐트에서 uri 파일을 전달하려고하는 것처럼 보입니다. – greenapps

답변

0

귀하의 웹 콘텐츠를 어떤 상대 경로를 통해 부하 help.html를 이동합니다 WebView을 트리거 무언가가 포함되어있는 것으로 나타났습니다. WebView의 기본 동작은 기본 웹 브라우저에 해당 페이지를로드하도록 요청하는 것입니다. 값이 file:///android_asset/Uri이면 작동하지 않습니다.

그래서 HTML을 검토하여 help.html으로 리디렉션하려고하는 것을 파악하고 수정하십시오. 또한 shouldOverrideUrlLoading()을 통해 이러한 종류의 페이지 로딩 동작을 제어 할 수있는 WebViewWebViewClient을 추가하는 것이 좋습니다.

+0

감사! 필자는'HelpActivity' 클래스의'WebView'에'WebViewClient'를 추가하고 아래와 같이 shouldOverrideUrlLoading을 오버라이드 시켰습니다 :'webView.setWebViewClient (new WebViewClient() {@Override public boolean shouldOverrideUrlLoading (WebView webView, String url) {webView .loadUrl (url); return true;}'이 문제를 해결했다. 그러나 Nougat으로 업데이트하기 전에 이것이 필요하지 않은 이유를 정확히 이해하지 못한다. (html에 상대 경로 href 링크에서) – Lauren

관련 문제