Android WebView和Word Online

时间:2019-03-18 23:43:25

标签: java android webview

我正在一个Android项目上,我必须打开一个Word Online文档,而该文档必须在不暴露URL的情况下打开。我有下面的代码打开一个文档,但是正在发生某种错误。我很确定这与权限有关,但是我不确定到底缺少什么。

FrameLayout.LayoutParams rl = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
                android.webkit.WebView wView = new android.webkit.WebView(this.getContext());
                wView.setId(0x100);
                //wView.setWebChromeClient(new WebChromeClient());
                wView.setWebViewClient(new WebViewClient());
                wView.getSettings().setJavaScriptEnabled(true);
                wView.getSettings().setAllowFileAccess(true);
                wView.getSettings().setAllowUniversalAccessFromFileURLs(true);
                wView.getSettings().setAllowContentAccess(true);
                wView.getSettings().setAppCacheEnabled(true);
                wView.getSettings().setAppCachePath(getContext().getCacheDir().getPath());

                wView.setScrollContainer(false);
                wView.setLayoutParams(rl);
                wView.loadUrl(docURL);

这是显示视图时的日志

I/WebViewFactory: Loading com.android.chrome version 72.0.3626.121 (code 362612102)
I/cr_LibraryLoader: Time to load native libraries: 17 ms (timestamps 4146-4163)
I/chromium: [INFO:library_loader_hooks.cc(42)] Chromium logging enabled: level = 0, default verbosity = 0
I/cr_LibraryLoader: Expected native library version number "72.0.3626.121", actual native library version number "72.0.3626.121"
W/cr_ChildProcLH: Create a new ChildConnectionAllocator with package name = com.android.chrome, sandboxed = true
I/cr_BrowserStartup: Initializing chromium process, singleProcess=false
W/ResourceType: Failure getting entry for 0x7f120538 (t=17 e=1336) (error -2147483647)
W/nicle.chronicle: type=1400 audit(0.0:15466): avc: denied { read } for name="vmstat" dev="proc" ino=4026532345 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:proc:s0 tclass=file permissive=0
W/Adreno-EGL: <qeglDrvAPI_eglGetConfigAttrib:612>: EGL_BAD_ATTRIBUTE
W/Chrome_InProcGp: type=1400 audit(0.0:15467): avc: denied { search } for name="kgsl-3d0" dev="sysfs" ino=19452 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs_kgsl:s0 tclass=dir permissive=0
W/Adreno-ES20: <get_gpu_clk:229>: open failed: errno 13
W/Adreno-EGL: <qeglDrvAPI_eglGetConfigAttrib:612>: EGL_BAD_ATTRIBUTE
I/Choreographer: Skipped 46 frames!  The application may be doing too much work on its main thread.
W/cr_CrashFileManager: /data/user/0/com.gochronicle.chronicle/cache/WebView/Crash Reports does not exist or is not a directory
W/VideoCapabilities: Unrecognized profile 2130706433 for video/avc
Unrecognized profile 2130706434 for video/avc
W/VideoCapabilities: Unsupported mime video/divx
W/VideoCapabilities: Unsupported mime video/divx4
W/VideoCapabilities: Unrecognized profile 2130706433 for video/avc
Unrecognized profile 2130706434 for video/avc
I/VideoCapabilities: Unsupported profile 4 for video/mp4v-es
W/Adreno-ES20: <get_gpu_clk:229>: open failed: errno 13
W/Chrome_InProcGp: type=1400 audit(0.0:15468): avc: denied { search } for name="kgsl-3d0" dev="sysfs" ino=19452 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs_kgsl:s0 tclass=dir permissive=0
 I/zygote: Do partial code cache collection, code=1006KB, data=690KB
I/zygote: After code cache collection, code=1006KB, data=690KB
Increasing code cache capacity to 3MB
I/chromium: [INFO:CONSOLE(1)] "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.", source: https://c1-word-view-15.cdn.office.net/wv/s/161151337776_App_Scripts/WordViewer.js (1)
I/chromium: [INFO:CONSOLE(0)] "The resource https://c1-word-edit-15.cdn.office.net/we/s/161151337776_App_Scripts/jSanity.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.", source:  (0)
I/chromium: [INFO:CONSOLE(0)] "The resource https://c1-word-edit-15.cdn.office.net/we/s/161151337776_App_Scripts/Compat.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.", source:  (0)
I/chromium: [INFO:CONSOLE(0)] "The resource https://c1-officeapps-15.cdn.office.net/we/s/161151337776_App_Scripts/MicrosoftAjax.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.", source:  (0)
[INFO:CONSOLE(0)] "The resource https://c1-word-edit-15.cdn.office.net/we/s/161151337776_App_Scripts/WordEditor.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.", source:  (0)
[INFO:CONSOLE(0)] "The resource https://c1-word-edit-15.cdn.office.net/we/s/161151337776_App_Scripts/wacbootwe.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.", source:  (0)

这似乎是错误,尽管我已经完成了所有的webview设置并获得了广泛的权限

D/libc-netbsd: getaddrinfo: word-edit.officeapps.live.com get result from proxy gai_error = 0
D/OpenSSLLib: OpensslErr:Module:12(116:176); file:external/boringssl/src/crypto/asn1/asn1_lib.c ;Line:186;Function:ASN1_get_object
D/OpenSSLLib: OpensslErr:Module:12(116:176); file:external/boringssl/src/crypto/asn1/asn1_lib.c ;Line:186;Function:ASN1_get_object
D/OpenSSLLib: OpensslErr:Module:12(116:176); file:external/boringssl/src/crypto/asn1/asn1_lib.c ;Line:186;Function:ASN1_get_object
OpensslErr:Module:12(116:176); file:external/boringssl/src/crypto/asn1/asn1_lib.c ;Line:186;Function:ASN1_get_object
D/libc-netbsd: [getaddrinfo]: hostname=word-view.officeapps.live.com; servname=(null); netid=0; mark=0
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=1024; ai_family=0
D/libc-netbsd: getaddrinfo: word-view.officeapps.live.com get result from proxy gai_error = 0
D/libc-netbsd: [getaddrinfo]: hostname=c1-officeapps-15.cdn.office.net; servname=(null); netid=0; mark=0
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=1024; ai_family=0
D/libc-netbsd: [getaddrinfo]: hostname=c1-word-view-15.cdn.office.net; servname=(null); netid=0; mark=0
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=1024; ai_family=0
D/libc-netbsd: getaddrinfo: c1-word-view-15.cdn.office.net get result from proxy gai_error = 0
D/libc-netbsd: getaddrinfo: c1-officeapps-15.cdn.office.net get result from proxy gai_error = 0
D/OpenSSLLib: OpensslErr:Module:12(116:176); file:external/boringssl/src/crypto/asn1/asn1_lib.c ;Line:186;Function:ASN1_get_object
OpensslErr:Module:12(116:176); file:external/boringssl/src/crypto/asn1/asn1_lib.c ;Line:186;Function:ASN1_get_object

enter image description here

4 个答案:

答案 0 :(得分:0)

您可以使用WebView和如下所示的Google文档以另一种方式实现这一目标。

String url = "http://docs.google.com/gview?embedded=true&url="+YOUR_DOC_URL;

private void loadWebViewAndDocUrl()
{
    String googleDocViewer = "<iframe src=\""+url+"\" style=\"width:100%; height:100%;\" frameborder=\"0\" allowtransparency=\"true\"></iframe>";
    progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
    final WebView wvExternalLink = (WebView) view.findViewById(R.id.wvExternalLink);
    wvExternalLink.getSettings().setJavaScriptEnabled(true);

    wvExternalLink.loadData(googleDocViewer, "text/html", "utf-8");

    wvExternalLink.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            wvExternalLink.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            // Show progress till url loads completely using progressbar
        }
    });


}

答案 1 :(得分:0)

您可以尝试

<plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
      <annotationProcessorPaths>
         <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
         </path>
         <path>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-jpamodelgen</artifactId>
             <version>5.4.1.Final</version>
         </path>
      </annotationProcessorPaths>
   </configuration>
</plugin>

答案 2 :(得分:0)

您应该尝试在平板电脑的浏览器(最好是Chrome)上打开eb deploy

您的代码为this文档工作,适用于三星Galaxy J7 Pro(Android 8.1)和Moto G4(Android 7.0)。两种物理设备。而且它没有显示URL。

它还可以在模拟Android docURL(即Android 6.0)上运行。

您唯一需要的权限是:

Nexus 5 API 23

请确保您的平板电脑上的Android WebView是最新的。

这也可能与您的DNS设置,文档的内容或文档的域有关。我创建了用于测试的链接,该链接将转到文件->共享->插入博客或站点,并获取了生成的iframe的src属性的内容。

答案 3 :(得分:0)

在您的日志文件中,我可以看到导致崩溃的两个主要原因。

W/cr_CrashFileManager: 
/data/user/0/com.gochronicle.chronicle/cache/WebView/Crash Reports does not 
exist or is not a directory


I/Choreographer: Skipped 46 frames!  The application may be doing too much 
work on its main thread.

前一个错误可能是由于appCachePath由于路径错误而花费了一些时间处理的。

后面的错误是由于您的代码/ Webview处理时间过长,因此而导致帧被跳过,这可能是由于您在应用程序核心进行的繁重处理导致线程停止一会儿。

解决方案是使用与主UI线程分开的线程,您可以在android中使用AsyncTask。

在这种情况下,如果错误是由于找不到appCachePath的目录导致,则可能不需要执行异步任务。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
FrameLayout.LayoutParams rl = new 
FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 
FrameLayout.LayoutParams.MATCH_PARENT);
            android.webkit.WebView wView = new 
android.webkit.WebView(this.getContext());
            wView.setId(0x100);
            //wView.setWebChromeClient(new WebChromeClient());
            wView.setWebViewClient(new WebViewClient());
            wView.getSettings().setJavaScriptEnabled(true);
            wView.getSettings().setAllowFileAccess(true);
            wView.getSettings().setAllowUniversalAccessFromFileURLs(true);
            wView.getSettings().setAllowContentAccess(true);
            wView.getSettings().setAppCacheEnabled(true);
            //also check this line of code for appCachePath
            String appCachePath = this.getCacheDir().getAbsolutePath();
             webSettings.setAppCachePath(appCachePath);



            wView.setScrollContainer(false);
            wView.setLayoutParams(rl);

            //execute asynctTask
          new LoadWebViewAsync.execute();

}

   class LoadWebViewAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

          wView.loadUrl(linktourl);
            return null;
        }
    };