RK3399 Android7.1 系统打印方案(一)编译
Android默认实现了打印的框架,使用PrintManager+PrintManagerService
但是有些系统裁剪了打印服务
一.packages\apps\Settings\src\com\android\settings\SettingsActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | setTileEnabled( new ComponentName(packageName, Settings.PrintSettingsActivity. class .getName()), pm.hasSystemFeature(PackageManager.FEATURE_PRINTING), isAdmin, pm); private void setTileEnabled(ComponentName component, boolean enabled, boolean isAdmin, PackageManager pm) { if (UserHandle.MU_ENABLED && !isAdmin && getPackageName().equals(component.getPackageName()) && !ArrayUtils.contains(SETTINGS_FOR_RESTRICTED, component.getClassName())) { enabled = false ; } setTileEnabled(component, enabled); } |
hasSystemFeature(String string).通过该函数判断系统是否有特定的模块功能
1 2 3 4 | PackageManager pm = context.getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_PRINTING)) { Log.d( "gatsby" , "Feature android.software.print not available" ); } |
frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java
1 2 3 4 5 6 7 8 9 10 11 | @Override public boolean hasSystemFeature(String name, int version) { synchronized (mPackages) { final FeatureInfo feat = mAvailableFeatures.get(name); if (feat == null ) { return false ; } else { return feat.version >= version; } } } |
mAvailableFeatures
1 2 3 4 5 6 | public PackageManagerService(Context context, Installer installer, …………………… SystemConfig systemConfig = SystemConfig.getInstance(); mGlobalGids = systemConfig.getGlobalGids(); mSystemPermissions = systemConfig.getSystemPermissions(); mAvailableFeatures = systemConfig.getAvailableFeatures(); |
这个列表读取的是/sytem/etc/permissions下面的xml文件的feature节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SystemConfig() { // Read configuration from system readPermissions(Environment.buildPath( Environment.getRootDirectory(), "etc" , "sysconfig" ), ALLOW_ALL); // Read configuration from the old permissions dir readPermissions(Environment.buildPath( Environment.getRootDirectory(), "etc" , "permissions" ), ALLOW_ALL); // Allow ODM to customize system configs around libs, features and apps int odmPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES | ALLOW_APP_CONFIGS; readPermissions(Environment.buildPath( Environment.getOdmDirectory(), "etc" , "sysconfig" ), odmPermissionFlag); readPermissions(Environment.buildPath( Environment.getOdmDirectory(), "etc" , "permissions" ), odmPermissionFlag); // Only allow OEM to customize features readPermissions(Environment.buildPath( Environment.getOemDirectory(), "etc" , "sysconfig" ), ALLOW_FEATURES); readPermissions(Environment.buildPath( Environment.getOemDirectory(), "etc" , "permissions" ), ALLOW_FEATURES); } |
二.frameworks\native\data\etc\tablet_core_hardware.xml 加入print feature
1 2 3 4 5 6 7 | <!-- basic system services --> <feature name= "android.software.app_widgets" /> <feature name= "android.software.voice_recognizers" /> <feature name= "android.software.backup" /> <feature name= "android.software.home_screen" /> <feature name= "android.software.input_methods" /> <feature name= "android.software.print" /> |
三.惠普打印机
打印测试demo HPprintsdksample.apk https://github.com/mobileprint/android-print-sdk
1.1.rk3399 打印测试demo 异常 找补不到图片资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | 09 - 22 15 : 11 : 29.738 I/ActivityManager( 514 ): Displayed com.android.printspooler/.ui.PrintActivity: +246ms 09 - 22 15 : 11 : 29.747 D/skia ( 2888 ): ---- fAsset->read( 8192 ) returned 0 09 - 22 15 : 11 : 29.747 D/skia ( 2888 ): --- SkAndroidCodec::NewFromStream returned null 09 - 22 15 : 11 : 29.748 D/AndroidRuntime( 2888 ): Shutting down VM --------- beginning of crash 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): FATAL EXCEPTION: main 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): Process: com.android.printspooler, PID: 2888 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): android.view.InflateException: Binary XML file line # 113 : Binary XML file line # 273 : Error inflating class android.widget.ImageView 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): Caused by: android.view.InflateException: Binary XML file line # 273 : Error inflating class android.widget.ImageView 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): Caused by: java.lang.reflect.InvocationTargetException 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at java.lang.reflect.Constructor.newInstance0(Native Method) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at java.lang.reflect.Constructor.newInstance(Constructor.java: 430 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.createView(LayoutInflater.java: 645 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java: 58 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.onCreateView(LayoutInflater.java: 717 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java: 785 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java: 727 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflate(LayoutInflater.java: 858 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java: 821 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflate(LayoutInflater.java: 861 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java: 821 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.parseInclude(LayoutInflater.java: 994 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflate(LayoutInflater.java: 854 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java: 821 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.inflate(LayoutInflater.java: 518 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.inflate(LayoutInflater.java: 426 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.inflate(LayoutInflater.java: 377 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java: 415 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.app.Activity.setContentView(Activity.java: 2428 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.printspooler.ui.PrintActivity.onPrinterRegistryReady(PrintActivity.java: 303 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.printspooler.ui.PrintActivity.-com_android_printspooler_ui_PrintActivity_lambda$ 2 (PrintActivity.java: 295 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.printspooler.ui.PrintActivity$-void_-com_android_printspooler_ui_PrintActivity_lambda$1_android_os_IBinder_documentAdapter_LambdaImpl0.run(PrintActivity.java) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.os.Handler.handleCallback(Handler.java: 755 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.os.Handler.dispatchMessage(Handler.java: 95 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.os.Looper.loop(Looper.java: 154 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.app.ActivityThread.main(ActivityThread.java: 6157 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at java.lang.reflect.Method.invoke(Native Method) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 912 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 802 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): Caused by: android.content.res.Resources$NotFoundException: Drawable com.android.printspooler:drawable/ic_expand_more with resource ID # 0x7f020005 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_expand_more.xml from drawable resource ID # 0x7f020005 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java: 725 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java: 571 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.content.res.Resources.loadDrawable(Resources.java: 858 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.content.res.TypedArray.getDrawable(TypedArray.java: 928 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.View.<init>(View.java: 4202 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.widget.ImageView.<init>(ImageView.java: 155 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.widget.ImageView.<init>(ImageView.java: 150 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.widget.ImageView.<init>(ImageView.java: 146 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at java.lang.reflect.Constructor.newInstance0(Native Method) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at java.lang.reflect.Constructor.newInstance(Constructor.java: 430 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.createView(LayoutInflater.java: 645 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java: 58 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.onCreateView(LayoutInflater.java: 717 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java: 785 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java: 727 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflate(LayoutInflater.java: 858 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java: 821 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflate(LayoutInflater.java: 861 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java: 821 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.parseInclude(LayoutInflater.java: 994 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflate(LayoutInflater.java: 854 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java: 821 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.inflate(LayoutInflater.java: 518 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.inflate(LayoutInflater.java: 426 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.view.LayoutInflater.inflate(LayoutInflater.java: 377 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java: 415 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.app.Activity.setContentView(Activity.java: 2428 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.printspooler.ui.PrintActivity.onPrinterRegistryReady(PrintActivity.java: 303 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.printspooler.ui.PrintActivity.-com_android_printspooler_ui_PrintActivity_lambda$ 2 (PrintActivity.java: 295 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.printspooler.ui.PrintActivity$-void_-com_android_printspooler_ui_PrintActivity_lambda$1_android_os_IBinder_documentAdapter_LambdaImpl0.run(PrintActivity.java) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.os.Handler.handleCallback(Handler.java: 755 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.os.Handler.dispatchMessage(Handler.java: 95 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.os.Looper.loop(Looper.java: 154 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.app.ActivityThread.main(ActivityThread.java: 6157 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at java.lang.reflect.Method.invoke(Native Method) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 912 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 802 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line # 22 : <bitmap> requires a valid 'src' attribute 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.BitmapDrawable.updateStateFromTypedArray(BitmapDrawable.java: 787 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.BitmapDrawable.inflate(BitmapDrawable.java: 747 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.DrawableInflater.inflateFromXml(DrawableInflater.java: 130 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java: 1227 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java: 188 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java: 116 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.DrawableInflater.inflateFromXml(DrawableInflater.java: 130 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java: 1227 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.graphics.drawable.Drawable.createFromXml(Drawable.java: 1200 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java: 715 ) 09 - 22 15 : 11 : 29.749 E/AndroidRuntime( 2888 ): ... 36 more 09 - 22 15 : 11 : 29.757 W/ActivityManager( 514 ): Force finishing activity com.android.printspooler/.ui.PrintActivity 09 - 22 15 : 11 : 29.760 W/ActivityManager( 514 ): Force finishing activity com.hp.mss.printsdksample/.activity.MainActivity 09 - 22 15 : 11 : 29.775 I/Process ( 2888 ): Sending signal. PID: 2888 SIG: 9 09 - 22 15 : 11 : 29.794 D/OpenGLRenderer( 2023 ): endAllActiveAnimators on 0x7f4ef8a800 (RippleDrawable) with handle 0x7f58536960 09 - 22 15 : 11 : 29.813 W/InputDispatcher( 514 ): channel '9f5c3d6 com.android.printspooler/com.android.printspooler.ui.PrintActivity (server)' ~ Consumer closed input channel or an error occurred. events= 0x9 09 - 22 15 : 11 : 29.813 E/InputDispatcher( 514 ): channel '9f5c3d6 com.android.printspooler/com.android.printspooler.ui.PrintActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 09 - 22 15 : 11 : 29.825 D/GraphicsStats( 514 ): Buffer count: 10 09 - 22 15 : 11 : 29.825 I/WindowManager( 514 ): WIN DEATH: Window{9f5c3d6 u0 com.android.printspooler/com.android.printspooler.ui.PrintActivity} 09 - 22 15 : 11 : 29.825 W/InputDispatcher( 514 ): Attempted to unregister already unregistered input channel '9f5c3d6 com.android.printspooler/com.android.printspooler.ui.PrintActivity (server)' 09 - 22 15 : 11 : 29.826 I/ActivityManager( 514 ): Process com.android.printspooler (pid 2888 ) has died 09 - 22 15 : 11 : 29.826 D/ActivityManager( 514 ): cleanUpApplicationRecord -- 2888 09 - 22 15 : 11 : 29.827 W/ActivityManager( 514 ): Scheduling restart of crashed service com.android.printspooler/.model.PrintSpoolerService in 1000ms 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): Error clearing print spooler client 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): android.os.DeadObjectException 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.os.BinderProxy.transactNative(Native Method) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.os.BinderProxy.transact(Binder.java: 617 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.print.IPrintSpooler$Stub$Proxy.setClient(IPrintSpooler.java: 647 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.server.print.RemotePrintSpooler.clearClientLocked(RemotePrintSpooler.java: 679 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.server.print.RemotePrintSpooler.-wrap0(RemotePrintSpooler.java) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.server.print.RemotePrintSpooler$MyServiceConnection.onServiceDisconnected(RemotePrintSpooler.java: 711 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java: 1469 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java: 1483 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.os.Handler.handleCallback(Handler.java: 755 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.os.Handler.dispatchMessage(Handler.java: 95 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at android.os.Looper.loop(Looper.java: 154 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.server.SystemServer.run(SystemServer.java: 359 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.server.SystemServer.main(SystemServer.java: 226 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at java.lang.reflect.Method.invoke(Native Method) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 912 ) 09 - 22 15 : 11 : 29.827 D/RemotePrintSpooler( 514 ): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 802 ) 09 - 22 15 : 11 : 29.830 W/System.err( 1690 ): java.lang.IllegalStateException: Observer com.hp.android.printservice.service.o$h$a @197f3db was not registered. 09 - 22 15 : 11 : 29.830 W/System.err( 1690 ): at android.database.Observable.unregisterObserver(Observable.java: 69 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java: 42 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at com.hp.android.printservice.service.o$h.onStopPrinterDiscovery(PrintServiceHelperBase.java: 4 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at android.printservice.PrinterDiscoverySession.stopPrinterDiscovery(PrinterDiscoverySession.java: 511 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at android.printservice.PrintService$ServiceHandler.handleMessage(PrintService.java: 498 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at android.os.Handler.dispatchMessage(Handler.java: 102 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at android.os.Looper.loop(Looper.java: 154 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at android.app.ActivityThread.main(ActivityThread.java: 6157 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at java.lang.reflect.Method.invoke(Native Method) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 912 ) 09 - 22 15 : 11 : 29.831 W/System.err( 1690 ): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 802 ) 09 - 22 15 : 11 : 29.832 I/art ( 1154 ): Ignoring second debugger -- accepting and dropping 09 - 22 15 : 11 : 29.848 I/art ( 514 ): Ignoring second debugger -- accepting and dropping 09 - 22 15 : 11 : 29.856 I/art ( 708 ): Ignoring second debugger -- accepting and dropping |
1.2. PrintSpooler
系统打印是通过一个系统apk实现的,叫做com.android.printspooler,位置在/system/app/PrintSpooler/中
这个apk的另外一个作用是接收来自用户APP的打印请求。用户APP的打印请求先被PrintManger通过PrintJob方式封装,
然后通过Intent唤起PrintSpooler的PrintActivity进行预览。如果打印机设备厂商实现了Print Plugin并提供apk安装到系统,
那么PrintSpooler就可以找到对应打印机驱动进行打印。
Android系统提供的这个打印框架尽管简单,但是接口功能局限,不能实现很多自定义的需求。
1.3. Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_expand_more.xml from drawable resource ID #0x7f020005
1.4.解决法案
device\rockchip\common\device.mk
1 2 3 | PRODUCT_AAPT_CONFIG ?= normal large xlarge hdpi xhdpi xxhdpi PRODUCT_AAPT_PREF_CONFIG ?= xhdpi PRODUCT_LOCALES := en_US zh_TW zh_CN |
device\rockchip\rk3399\rk3399_all.mk
1 2 | #PRODUCT_AAPT_CONFIG := normal large mdpi tvdpi hdpi xhdpi #PRODUCT_AAPT_PREF_CONFIG := hdpi |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】