【问题标题】:App Crashing when calling New Activity Intent from Webview?从 Webview 调用 New Activity Intent 时应用程序崩溃?
【发布时间】:2022-01-19 02:35:48
【问题描述】:

我正在开发应用程序以从 Webview 将 PDF 文件加载到新的 PDF 活动中 使用意图和 PdfViewer.jar 库。我知道无法在 Webview 中打开 PDF 文件,但尝试在 activity_pdf.xml 中打开 当我单击 Webview 中的链接时,我的应用程序无法调用 PdfViewer.class 并崩溃,这可能是什么原因。请帮助我被困在这里。 代码看起来不错,没有错误。

public class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Intent intent = new Intent(PdfActivity.this,PdfViewer.class);
            final Uri uri = PdfActivity.this.getIntent().getData();
            URL pdfurl = null;

            try {
                pdfurl = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }

            intent.putExtra("PDFURL", pdfurl);
            startActivity(intent);
            System.out.println("PDF WORKING");

            return super.shouldOverrideUrlLoading(view, url);
        }

参考我的 Logcat 错误

2022-01-19 04:17:12.401 22159-22159/ak.wp.meto E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ak.wp.meto, PID: 22159
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
        at ak.wp.meto.activity.PdfActivity$MyWebViewClient.shouldOverrideUrlLoading(PdfActivity.java:90)
        at android.webkit.WebViewClient.shouldOverrideUrlLoading(WebViewClient.java:83)
        at org.chromium.android_webview.AwContentsClientBridge.shouldOverrideUrlLoading(Unknown Source:90)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:335)
        at android.os.Looper.loop(Looper.java:206)
        at android.app.ActivityThread.main(ActivityThread.java:8595)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

这行的错误是什么?我在这一行收到 logcat 错误。请帮忙

        pdfurl = new URL(uri.getScheme(), uri.getHost(), uri.getPath());

我正在使用 PdfViewer.jar 库,在 README 文本中提到使用,请参阅下面的链接供您参考, https://sourceforge.net/p/andpdf/code/HEAD/tree/tag/Beta_0_1_11/AndroidPdfViewer/activitysrc/net/sf/andpdf/

【问题讨论】:

  • 我对您的代码有一些疑问,您如何将链接映射为 pdf 以重新启动活动?

标签: android android-studio android-intent webview nullpointerexception


【解决方案1】:

问题是你的 uri (Uri uri = PdfActivity.this.getIntent().getData();) 变量不会从意图中获取数据。因此,您需要先获取数据以使用 @Manjeetdeswal 回答的 final Uri uri= getIntent().getStringExtra("name");

【讨论】:

    【解决方案2】:
    1. 从哪里获取 uri。

    2. 它清楚地表明uri为空意味着没有价值。

    3. 如果您是从以前的活动中获得的,请使用它。

        final Uri uri= getIntent().getStringExtra("name");
      

    【讨论】:

      【解决方案3】:
      public class MyWebViewClient extends WebViewClient {
              @Override
              public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  Intent intent;
      URL pdfurl = null;
      if( PdfActivity.this.getIntent().getStringExtra("your key")!=null){
                  final Uri uri = PdfActivity.this.getIntent().getData();
                  try {
                      pdfurl = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
                  } catch (MalformedURLException e) {
                      e.printStackTrace();
                  }
      }
      if(/*check the URL is pdf contained URL*/){// check with url(String)
                  intent = new Intent(PdfActivity.this,PdfViewer.class);
                  intent.putExtra("PDFURL", pdfurl);
                  startActivity(intent);
                  System.out.println("PDF WORKING");
      }
                  return super.shouldOverrideUrlLoading(view, url);
              }
      

      检查 pdf 是否包含在 URL 中,然后将 URL 传递给另一个活动

      【讨论】:

        【解决方案4】:

        只需将启动意图代码移动到 try catch 中即可。仅当存在 pdfurl 时才启动新活动或显示错误。

         public class MyWebViewClient extends WebViewClient {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Intent intent = new Intent(PdfActivity.this,PdfViewer.class);
                final Uri uri = PdfActivity.this.getIntent().getData();
                URL pdfurl = null;
        
                try {
                    pdfurl = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
        

        intent.putExtra("PDFURL", pdfurl); 开始活动(意图); System.out.println("PDF 工作"); } 捕捉(MalformedURLException e){ e.printStackTrace(); }

                return super.shouldOverrideUrlLoading(view, url);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-27
          • 2023-03-14
          • 2014-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多