java.lang.NoClassDefFoundError:无法解析:Landroid/webkit/PacProcessor

2024-04-24

实在找不到言语,我的项目只是一天天都无法编译。

这就是我所做的:

我下载并显示一个 PDF,然后将其作为保存的 PDF 打印到设备上,然后崩溃了。

这是崩溃的情况:

at java.lang.Class java.lang.Class.classForName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:453)
   at java.lang.Class android.webkit.WebViewFactory.getWebViewProviderClass(java.lang.ClassLoader) (WebViewFactory.java:176)
   at java.lang.Class android.webkit.WebViewFactory.getProviderClass() (WebViewFactory.java:459)
   at android.webkit.WebViewFactoryProvider android.webkit.WebViewFactory.getProvider() (WebViewFactory.java:251)
   at android.webkit.WebViewFactoryProvider android.webkit.WebView.getFactory() (WebView.java:2681)
   at void android.webkit.WebView.ensureProviderCreated() (WebView.java:2676)
   at void android.webkit.WebView.setOverScrollMode(int) (WebView.java:2741)
   at void android.view.View.<init>(android.content.Context) (View.java:4815)
   at void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int) (View.java:4956)
   at void android.view.ViewGroup.<init>(android.content.Context, android.util.AttributeSet, int, int) (ViewGroup.java:659)
   at void android.widget.AbsoluteLayout.<init>(android.content.Context, android.util.AttributeSet, int, int) (AbsoluteLayout.java:55)
   at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) (WebView.java:659)
   at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int) (WebView.java:604)
   at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int) (WebView.java:587)
   at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet) (WebView.java:574)
   at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
   at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:343)
   at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:647)
   at android.view.View com.android.internal.policy.PhoneLayoutInflater.onCreateView(java.lang.String, android.util.AttributeSet) (PhoneLayoutInflater.java:58)
   at android.view.View android.view.LayoutInflater.onCreateView(android.view.View, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:720)
   at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:788)

(实际的错误太长了,我无法将其发布到stackoverflow中,而且都不是我自己的代码,它与Android的webview有问题。)


这是发生崩溃的活动代码:

public class ActivityPrintSurvey extends ActivityBase implements MVPView, View.OnClickListener, SendScannedSignedDocumentTask.SendScannedSignedDocumentCallback {
    
    Document document;
    Patient patient;
    SurveyBundle surveyBundle;

    View hider;
    Button printBtn;
    Button backBtn;
    WebView webView;
    ProgressBar progressBar;
    Switch switcher;

    boolean canPrint = false;

    PrintManager printManager;
    String jobName;

    String fileName;

    String pdfUrl;
    String showPdfUrl;
    private int SIGNING_DONE_1 = 105;

    int runnableCounter = 0;
    final int RUNNABLE_MAX = 3;

    private void log(Object o) {

        Log.i("PRINTING_ACT", o.toString());
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_print_survey);


        log("activity started");

        hider = findViewById(R.id.hider);
        printBtn = findViewById(R.id.print_btn);
        backBtn = findViewById(R.id.back_btn);
        webView = findViewById(R.id.web_view);
        progressBar = findViewById(R.id.progressbar);
        switcher = findViewById(R.id.read_and_accepted_switch);


        document = (Document) getIntent().getSerializableExtra("document");
        patient = (Patient) getIntent().getSerializableExtra("patient");
        surveyBundle = (SurveyBundle) getIntent().getSerializableExtra("survey_bundle");

        jobName = this.getString(R.string.app_name) + " Document";
        printManager = (PrintManager) this.getSystemService(Context.PRINT_SERVICE);

        printBtn.setOnClickListener(this);
        backBtn.setOnClickListener(this);


        showPDF();
    }


    private void showPDF() {

        log("starting to show pdf");

        pdfUrl = document.getPdfUrl();

        String embedUrl = "https://docs.google.com/gview?embedded=true&url=";
        showPdfUrl = embedUrl + pdfUrl;

        progressBar.setVisibility(View.VISIBLE);
        hider.setVisibility(View.VISIBLE);

        final Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {

                if (runnableCounter < RUNNABLE_MAX) {
                    runnableCounter++;
                    webView.getSettings().setJavaScriptEnabled(true);
                    webView.loadUrl(showPdfUrl);
                    handler.postDelayed(this, 1000);
                    //Szörnyűséges a helyzet, az android szemét használhatatlan webview nem mindig jeleníti meg a pdf-et, ezért rá kell frissíteni párszor, hogy biztos megjelenítse, ez van.
                } else {
                    progressBar.setVisibility(View.GONE);
                    hider.setVisibility(View.GONE);

                }
            }
        };
        handler.post(runnable);
        downloadPDF();
    }


    public void downloadPDF() {

        log("starting to download pdf");

        fileName = FileHelper.generateTempFileName();

        ANRequest.DownloadBuilder downloadBuilder = AndroidNetworking.download(pdfUrl, FileHelper.getTempFileDirectory(this), fileName);
        downloadBuilder.doNotCacheResponse();
        ANRequest request = downloadBuilder.build();

        request.setDownloadProgressListener(new DownloadProgressListener() {
            @Override
            public void onProgress(long bytesDownloaded, long totalBytes) {
                // do anything with progress
                Log.i("ON_PROGRESS", bytesDownloaded + " / " + totalBytes);

            }
        }).startDownload(new DownloadListener() {
            @Override
            public void onDownloadComplete() {
                // do anything after completion
                canPrint = true;
            }

            @Override
            public void onError(ANError error) {
                // handle error
                Toast.makeText(ActivityPrintSurvey.this, error.getMessage(), Toast.LENGTH_LONG).show();
            }
        });

    }

    public void print() {

        log("starting to print");

        printManager.print(jobName, new PrintDocumentAdapter() {


            @Override
            public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) {
                InputStream input = null;
                OutputStream output = null;

                log("onWrite() called for printing");

                try {

                    File file = FileHelper.readTempFile(ActivityPrintSurvey.this, fileName);

                    input = new FileInputStream(file);
                    output = new FileOutputStream(destination.getFileDescriptor());

                    byte[] buf = new byte[1024];
                    int bytesRead;

                    while ((bytesRead = input.read(buf)) > 0) {
                        output.write(buf, 0, bytesRead);
                    }

                    callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES});
                    log("onWriteFinished() called for printing");

                } catch (Exception e) {
                    //Catch exception
                    e.printStackTrace();
                    log("Exception 1: " + e.getMessage());
                } finally {
                    try {
                        input.close();
                        output.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        log("Exception 2: " + e.getMessage());
                    }
                }
            }

            @Override
            public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) {
                log("onLayout() done");

                if (cancellationSignal.isCanceled()) {
                    callback.onLayoutCancelled();
                    log("onLayoutCancelled()");
                    return;
                }

                PrintDocumentInfo pdi = new PrintDocumentInfo.Builder(fileName/*Ez itt lehet bármi, kiskutya füle, nem kell megegyeznie az alap file nevvel*/).setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).build();
                callback.onLayoutFinished(pdi, true);
                log("onLayoutFinished() called");
            }

            @Override
            public void onFinish() {

                FileHelper.deleteTempFiles(ActivityPrintSurvey.this);

                log("onFinish() done");

                // ha kész a nyomtatás, jöhet a valós aláírás tollal, majd visszafotózás, és feltöltés

                new AlertDialog.Builder(ActivityPrintSurvey.this)
                        .setTitle(getString(R.string.next_step))
                        .setMessage(getString(R.string.please_scan_the_printed_and_signed_document))
                        .setPositiveButton(getString(R.string.scan), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                startScanningByCameraPhoto();
                            }
                        })
                        .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {

                            }
                        })
                        .show();

                log("showing alert dialog");

            }
        }, null);
    }

    public void startScanningByCameraPhoto() {

        // start picker to get image for cropping and then use the image in cropping activity
        CropImage.activity()
                .setGuidelines(CropImageView.Guidelines.ON)
                .start(this);

        log("startScanningByCameraPhoto");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        log("onActivityResult called");

        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == SIGNING_DONE_1) {

                log("RESULT_OK from SIGNING_DONE_1 -> calling .finish()");

                Intent intent = new Intent();
                intent.putExtra("document", document);
                setResult(Activity.RESULT_OK, intent);
                finish();
            }
        } else {
            log("1. Error: resultCode NOT RESULT OK");
        }

        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if (resultCode == RESULT_OK) {

                log("RESULT_OK from CROP_IMAGE_ACTIVITY_REQUEST_CODE");

                Uri resultUri = result.getUri();

                File file = new File(resultUri.getPath());

                showLoading();

                SendScannedSignedDocumentTask task = new SendScannedSignedDocumentTask(this, this, DatabaseHelper.getInstance().readLoggedInUser().getUserToken(), document, patient, file);
                task.execute();

            } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
                Exception error = result.getError();
                log("2. Error: resultCode NOT RESULT OK: " + error.getMessage());
                error.printStackTrace();
            }
        }

    }


    @Override
    public void handleUploadScannedDocumentAPIDone(String error) {

        hideLoading();

        if (error != null) {
            log("handleUploadScannedDocumentAPIDone, error:" + error);
            DialogHelper.showInfo(this, error);
        } else {
            log("handleUploadScannedDocumentAPIDone -> finishing()");
            setResult(Activity.RESULT_OK);
            Toast.makeText(this, "✔ " + getString(R.string.uploaded), Toast.LENGTH_LONG).show();
            finish();
        }
    }

    @Override
    public void onClick(View v) {

        if (v.equals(printBtn)) {

            if (switcher.isChecked()) {
                if (canPrint) {
                    print();
                } else {
                    Toast.makeText(this, "PDF not found in device. Retrying download...", Toast.LENGTH_LONG).show();
                    downloadPDF();
                }
            } else {
                DialogHelper.showInfo(this, getString(R.string.please_check_the_checkbox));
            }

        } else if (v.equals(backBtn)) {
            onBackPressed();
        }
    }

    public void hideLoading() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void showLoading() {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void showError(String error, String code) {
        hideLoading();
        canPrint = false;
        DialogHelper.showError(this, error);
        log("showing error: " + error);
    }


    @Override
    public void showSuccess(Object... object) {

        hideLoading();

        String api = object[0].toString();

        if (api.equals("eject_patient")) {

            log("showSuccess: " + "finishing activity.");

            Intent intent = new Intent(this, ActivityWaitingForPatient.class);
            startActivity(intent);
            finish();

        } else {
            log("showSuccess: " + "ERROR: " + api + " not equals " + "eject_patient");
        }
    }


    @Override
    public void onResume() {
        super.onResume();
        LayoutTextSizeChanger.changeAllTextSizeInLayout((ViewGroup) findViewById(R.id.main_cont), FontUtil.loadFontSize(this));

        log("onResume()"  );
    }


}

在运行时在我的应用程序中使用 WebView 时,我遇到了相同的异常和巨大的堆栈跟踪,具体取决于设备上安装的软件版本:

Chrome 版本:

  • 96.0.4664.92 / .104 - 好的,没有错误
  • 97.0.4692.98 - 错误,见下文

安卓版本:

  • Android 7 -> NoClassDefFoundError 为android.webkit.TracingController
  • Android 9 -> NoClassDefFoundError 为android.webkit.PacProcessor
  • Android 12 -> 没有此类错误

根据你的描述和堆栈跟踪,你在运行时看到这个错误,而不是在编译时,对吧?所以,我会推荐

  • 在 Android 12 目标上进行测试或
  • 安装旧版 Chrome
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.NoClassDefFoundError:无法解析:Landroid/webkit/PacProcessor 的相关文章

随机推荐

  • 如何避免添加多个 NSNotification 观察者?

    目前 API 似乎没有提供一种方法来检测是否已为特定 NSNotification 添加了观察者 除了在端维护一个标志来跟踪之外 避免添加多个 NSNotification 观察者的最佳方法是什么 有人已经创建了一个类别来促进这一点吗 防止
  • 如何设置 CirclePageIndicator 上的项目限制?

    I m using a ViewPager and a CirclePageIndicator from ViewPagerIndicator lib to show images with some circles below but t
  • Shadow DOM v1 CSS 填充

    https developers google com web fundamentals getting started primers shadowdom https developers google com web fundament
  • 如何在实体框架代码优先中设置 0..* 关系?

    我有两个类的下一个代码 public class Object public int ObjectID get set public int Object2ID get set public virtual Object2 Object2
  • MediaButtonIntentReceiver 在 Android 4.0+ 中不工作

    目标是拦截来自耳机以及蓝牙的广播 以响应来自耳机的不同类型的点击来改变媒体播放器 该解决方案适用于 ICS 之前的所有版本 这是我尝试过的一些代码和事情 private BroadcastReceiver mediaButtonReceiv
  • Wicket、页面堆栈和内存使用情况

    Wicket 应用程序序列化并缓存所有页面以支持有状态组件 以及支持后退按钮 以及其他可能的原因 我有一个使用 setResponsePage 在屏幕之间导航的应用程序 在很短的时间内 会话就会变得相当大 因为所有先前的页面都存储在会话中
  • 如何在 IIS 7.5 中启用 GZIP 压缩

    我想使用 GZIP 压缩我的文件 您能分享一下使用 GZIP 压缩文件的 web config 代码吗 上传 web config 文件后还需要做什么吗 GZip 压缩可以直接通过 IIS 启用 首先 打开IIS 转到您希望调整的网站并点击
  • 在 Docker 中使用私有模块构建 Go 应用程序

    我正在尝试在依赖于私有子模块的 docker 容器中构建一个 go 项目 我本来希望 mount type ssh会将我的 ssh 凭据传递给容器并且它会起作用 目前我可以在本地构建 只需制作GOPRIVATE变量集和git config
  • 从代码中获取全局色调颜色

    有没有办法通过代码从我的项目中获取全局色调颜色 为了避免误解 我指的是全局色调 我可以在文件检查器中设置它 Easy 目标C UIColor tintColor self view tintColor Swift let tintColor
  • 根据其他数据框的函数创建新的数据框

    我是 R 的新手 所以我可能很难提出我的问题 请多多包涵 我有两个数据框 为了解释起见 我们假设 df1 柱形代表收益类型 玉米 燕麦 小麦等 行代表一年中的月份 一月 二月等 Elements 代表在该特定月份购买的增益类型的每吨价格 d
  • 从Sql服务器中选择表并将数据插入到Mysql表中

    我有一个正在运行的 ms sql 服务器 并且希望将一些数据复制到 mysql 数据库 我已经可以连接到它们 所以我做了类似的事情 pdo new PDO SQLSERVER user password sql SELECT id name
  • 在 swift 中使用 UUID() 和 json

    我在网上找到了在 json 文件中使用硬编码 uuid 的示例 并且这些示例非常适合我 但是当我在应用程序中添加从 json 数组中删除项目的功能时 我需要动态创建这些 uuid 这是我的json文件 list json 它曾经有硬编码的i
  • Objective-C 中的二叉树

    我正在学习算法和数据结构 并尝试使用 Objective C 设计和实现二叉树进行训练 到目前为止 我有以下课程 main 供测试用 Node 树的节点 BinaryTree 对于与树相关的所有方法 最早的方法之一BinaryTree我实现
  • 创建一个过程来检索表上的所有索引并重建

    我想创建一个过程来检索表上的所有索引并重建 我用这个查询检索所有索引 select index name from user indexes where table name your table name 我用这个查询重建 alter i
  • 以编程方式获取导航栏的高度

    我知道更多视图控制器 导航栏 的存在将 UIView 的高度推低 我也知道这个高度 44px 我还发现这种下推可以维持 self view frame origin y 0 那么 除了将其设置为常量之外 如何确定该导航栏的高度呢 或者 更短
  • Java 堆转储是否包括线程堆栈

    我一直在使用 Eclipse 内存分析工具来检查堆转储 我还没有看到任何对象通过线程堆栈中的局部变量保持活动状态的情况 java线程堆栈是否保留在堆转储中 如果不是 这些对象是否会被视为转储中无法访问的对象 如果是这样 是否有任何方法可以保
  • C# 位图/图形内存不足

    我正在尝试拍摄整个屏幕的快照以读取像素值 事实上我这样做没有任何问题 但在 214 个快照之后 我出现了内存不足的异常 Bitmap ScreenShot new Bitmap Screen PrimaryScreen Bounds Wid
  • 从 C# Windows 窗体在 MS Word 中打开 MS Word 文档

    我希望能够通过单击表单上的按钮 从 C 表单中打开 MS Word 中已制作的 Word 文档 但不知道如何操作 请帮忙 Thanks 上次我使用 Excel 时 我使用以下代码打开它 Process Start FileLocation
  • 使用ExternalContext.redirect()将面孔消息添加到重定向页面

    我在用ExternalContext redirect String 将用户重定向到另一个页面的方法 FacesContext getCurrentInstance addMessage new FacesMessage Bla bla b
  • java.lang.NoClassDefFoundError:无法解析:Landroid/webkit/PacProcessor

    实在找不到言语 我的项目只是一天天都无法编译 这就是我所做的 我下载并显示一个 PDF 然后将其作为保存的 PDF 打印到设备上 然后崩溃了 这是崩溃的情况 at java lang Class java lang Class classF