【问题标题】:Android N: PrintManager.print() results in java.lang.IllegalStateException: Can print only from an activityAndroid N: PrintManager.print() 导致 java.lang.IllegalStateException: Can print only from an Activity
【发布时间】:2017-09-26 14:44:04
【问题描述】:

我的应用正在使用 PrintManager 进行 PDF 打印。此功能在 Android L 和 M 中运行良好,但在 Android N 下失败。

在 onOptionsItemSelected() 的选项菜单中的非片段活动中调用打印操作。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
    String jobName = "createPDFReport";
    printManager.print(jobName, new InterimReportAdapter(AuditValidation.this, auditObject), new PrintAttributes.Builder().build());
}

Android N 抛出

FATAL EXCEPTION: ec.kat.kataudit, PID: 4052
java.lang.IllegalStateException: Can print only from an activity
at android.print.PrintManager.print(PrintManager.java:525)
at ec.kat.kataudit.AuditValidation.onOptionsItemSelected(AuditValidation.java:124)
at android.app.Activity.onMenuItemSelected(Activity.java:3204)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:408)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
...

AuditValidation.java:124 指向 printManager.print() 调用。

Activity 扩展了 android.support.v7.app.AppCompatActivity。 编译目标版本为 25,应用正在使用最新的库(截至今天为 25.3.1)。

非常感谢任何想法!

最好的问候!

【问题讨论】:

    标签: java android pdf-generation illegalstateexception


    【解决方案1】:

    在你的活动中使用它

    private Context primaryBaseActivity;//THIS WILL KEEP ORIGINAL INSTANCE
    @Override
    protected void attachBaseContext(Context base) {
        primaryBaseActivity=base;
        super.attachBaseContext(base);
    }
    

    并替换这一行

    PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE); 
    

     PrintManager  printManager = (PrintManager) primaryBaseActivity.getSystemService(Context.PRINT_SERVICE);
    

    【讨论】:

      【解决方案2】:

      发现问题。在我的活动的 attachBaseContext() 中,我实现了语言交换,它让 Android N 通过 createConfigurationContext() 创建新的上下文。这显然会使正在使用的引用 PrintManager 实例无效,从而导致上述 IllegalStateException。 我现在必须为此找到解决方法。

      编辑: 我的解决方案是将传递给 attachBaseContext() 的原始上下文的引用存储在我的活动成员中。然后通过在原始上下文引用上调用 getSystemService() 来检索 PrintManager 实例,而不是比活动的。

      private Context primaryBaseActivity;//THIS WILL KEEP ORIGINAL INSTANCE
      
      @Override
      protected void attachBaseContext(Context newBase) {
          primaryBaseActivity=newBase;//SAVE ORIGINAL INSTANCE
      
          /*Some locale handling stuff right here*/
          /*LocaleHelper's onAttach is returning a *new* context in Android N which will void PrintManager's context*/
          super.attachBaseContext(LocaleHelper.onAttach(newBase,appLocale));
      
      }
      

      开始打印时(PDF 生成):

      PrintManager printManager = (PrintManager) primaryBaseActivity.getSystemService(Context.PRINT_SERVICE);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-17
        • 2022-12-27
        • 1970-01-01
        • 1970-01-01
        • 2014-01-22
        • 2019-05-26
        • 2019-03-11
        • 1970-01-01
        相关资源
        最近更新 更多