RK3399 Android7.1 系统打印方案(二)无.预览打印

 

一.调用系统打印预览demo  PrintManager

1.1.系统预览打印界面

.a.AndroidManifest.xml

.b.MyPrintAdapter.java

.c.MainActivity.java

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
package com.gatsby.printdemo;
 
import android.content.Context;
import android.os.Bundle;
import android.print.PrintAttributes;
import android.print.PrintManager;
 
import androidx.appcompat.app.AppCompatActivity;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        onPrintPdf();
    }
 
    private void onPrintPdf() {
        PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
        PrintAttributes.Builder builder = new PrintAttributes.Builder();
        builder.setColorMode(PrintAttributes.COLOR_MODE_COLOR);
        String filePath =  "/sdcard/111.pdf";
        printManager.print("test pdf print", new MyPrintAdapter(this,filePath), builder.build());
    }
}

1.2.frameworks\base\core\java\android\print\PrintManager.java

PrintJob 使用默认打印属性创建打印作业以打印 PrintDocumentAdapter 

PrintJobInfo printJob = result.getParcelable(EXTRA_PRINT_JOB);
IntentSender intent = result.getParcelable(EXTRA_PRINT_DIALOG_INTENT);

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
public @NonNull PrintJob print(@NonNull String printJobName,
        @NonNull PrintDocumentAdapter documentAdapter,
        @Nullable PrintAttributes attributes) {
    if (mService == null) {
        Log.w(LOG_TAG, "Feature android.software.print not available");
        return null;
    }
    if (!(mContext instanceof Activity)) {
        throw new IllegalStateException("Can print only from an activity");
    }
    if (TextUtils.isEmpty(printJobName)) {
        throw new IllegalArgumentException("printJobName cannot be empty");
    }
    if (documentAdapter == null) {
        throw new IllegalArgumentException("documentAdapter cannot be null");
    }
    PrintDocumentAdapterDelegate delegate = new PrintDocumentAdapterDelegate(
            (Activity) mContext, documentAdapter);
    try {
        Bundle result = mService.print(printJobName, delegate,
                attributes, mContext.getPackageName(), mAppId, mUserId);
        if (result != null) {
            PrintJobInfo printJob = result.getParcelable(EXTRA_PRINT_JOB);
            IntentSender intent = result.getParcelable(EXTRA_PRINT_DIALOG_INTENT);
            if (printJob == null || intent == null) {
                return null;
            }
            try {
                mContext.startIntentSender(intent, null, 0, 0, 0);
                return new PrintJob(printJob, this);
            } catch (SendIntentException sie) {
                Log.e(LOG_TAG, "Couldn't start print job config activity.", sie);
            }
        }
    } catch (RemoteException re) {
        throw re.rethrowFromSystemServer();
    }
    return null;
}

1.3.frameworks\base\packages\PrintSpooler\AndroidManifest.xml 

<action android:name="android.print.PRINT_DIALOG" />  intent 跳转到 PrintActivity 预览界面

1
2
3
4
5
6
7
8
9
10
11
<activity
    android:name=".ui.PrintActivity"
    android:configChanges="mnc|mnc|touchscreen|navigation|screenLayout|screenSize|smallestScreenSize|orientation|locale|keyboard|keyboardHidden|fontScale|uiMode|layoutDirection|density"
    android:permission="android.permission.BIND_PRINT_SPOOLER_SERVICE"
    android:theme="@style/Theme.PrintActivity">
    <intent-filter>
        <action android:name="android.print.PRINT_DIALOG" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="printjob" android:pathPattern="*" />
    </intent-filter>
</activity>

 二.打印预览界面

 2.1.设备列表选项框 spinner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- Destination -->
 
<FrameLayout
    android:id="@+id/static_content"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingStart="8dip"
    android:layout_marginEnd="16dp"
    android:elevation="@dimen/preview_controls_elevation"
    android:background="?android:attr/colorPrimary">
 
    <Spinner
        android:id="@+id/destination_spinner"
        android:layout_width="wrap_content"
        android:minWidth="@dimen/preview_destination_spinner_width"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dip"
        android:dropDownWidth="wrap_content"
        android:minHeight="?android:attr/listPreferredItemHeightSmall">
    </Spinner>
 
</FrameLayout>

2.2.加载布局 为Spinner提供Adapter显示加载数据  DataSetObserver register 注册观察者

1
2
3
4
5
6
7
8
9
10
private void bindUi() {
 
…………………………
 
        // Destination.
        mPrintersObserver = new PrintersObserver();
        mDestinationSpinnerAdapter.registerDataSetObserver(mPrintersObserver);
        mDestinationSpinner = (Spinner) findViewById(R.id.destination_spinner);
        mDestinationSpinner.setAdapter(mDestinationSpinnerAdapter);
        mDestinationSpinner.setOnItemSelectedListener(itemSelectedListener);

2.3.DestinationAdapter 

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
private final class DestinationAdapter extends BaseAdapter
        implements PrinterRegistry.OnPrintersChangeListener {
    private final List<PrinterHolder> mPrinterHolders = new ArrayList<>();
 
    private final PrinterHolder mFakePdfPrinterHolder;
 
    private boolean mHistoricalPrintersLoaded;
 
    /**
     * Has the {@link #mDestinationSpinner} ever used a view from printer_dropdown_prompt
     */
    private boolean hadPromptView;
 
    public DestinationAdapter() {
        mHistoricalPrintersLoaded = mPrinterRegistry.areHistoricalPrintersLoaded();
        if (mHistoricalPrintersLoaded) {
            addPrinters(mPrinterHolders, mPrinterRegistry.getPrinters());
        }
        mPrinterRegistry.setOnPrintersChangeListener(this);
        mFakePdfPrinterHolder = new PrinterHolder(createFakePdfPrinter());
    }
 
    public PrinterInfo getPdfPrinter() {
        return mFakePdfPrinterHolder.printer;
    }
 
    public int getPrinterIndex(PrinterId printerId) {
        for (int i = 0; i < getCount(); i++) {
            PrinterHolder printerHolder = (PrinterHolder) getItem(i);
            if (printerHolder != null && !printerHolder.removed
                    && printerHolder.printer.getId().equals(printerId)) {
                return i;
            }
        }
        return AdapterView.INVALID_POSITION;
    }
 
    public void ensurePrinterInVisibleAdapterPosition(PrinterInfo printer) {
        final int printerCount = mPrinterHolders.size();
        boolean isKnownPrinter = false;
        for (int i = 0; i < printerCount; i++) {
            PrinterHolder printerHolder = mPrinterHolders.get(i);
 
            if (printerHolder.printer.getId().equals(printer.getId())) {
                isKnownPrinter = true;
 
                // If already in the list - do nothing.
                if (i < getCount() - 2) {
                    break;
                }
                // Else replace the last one (two items are not printers).
                final int lastPrinterIndex = getCount() - 3;
                mPrinterHolders.set(i, mPrinterHolders.get(lastPrinterIndex));
                mPrinterHolders.set(lastPrinterIndex, printerHolder);
                break;
            }
        }
 
        if (!isKnownPrinter) {
            PrinterHolder printerHolder = new PrinterHolder(printer);
            printerHolder.removed = true;
 
            mPrinterHolders.add(Math.max(0, getCount() - 3), printerHolder);
        }
 
        // Force reload to adjust selection in PrintersObserver.onChanged()
        notifyDataSetChanged();
    } 

2.4.生成的列表 添加或者修改数据 notifyDataSetChanged()可以在修改适配器绑定的数据后 不用重新刷新Activity 通知Activity更新Spinner

onPrintersChanged 

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
@Override
public void onPrintersChanged(List<PrinterInfo> printers) {
    // We rearrange the printers if the user selects a printer
    // not shown in the initial short list. Therefore, we have
    // to keep the printer order.
 
    // Check if historical printers are loaded as this adapter is open
    // for busyness only if they are. This member is updated here and
    // when the adapter is created because the historical printers may
    // be loaded before or after the adapter is created.
    mHistoricalPrintersLoaded = mPrinterRegistry.areHistoricalPrintersLoaded();
 
    // No old printers - do not bother keeping their position.
    if (mPrinterHolders.isEmpty()) {
        addPrinters(mPrinterHolders, printers);
        notifyDataSetChanged();
        return;
    }
 
    // Add the new printers to a map.
    ArrayMap<PrinterId, PrinterInfo> newPrintersMap = new ArrayMap<>();
    final int printerCount = printers.size();
    for (int i = 0; i < printerCount; i++) {
        PrinterInfo printer = printers.get(i);
        newPrintersMap.put(printer.getId(), printer);
    }
 
    List<PrinterHolder> newPrinterHolders = new ArrayList<>();
 
    // Update printers we already have which are either updated or removed.
    // We do not remove the currently selected printer.
    final int oldPrinterCount = mPrinterHolders.size();
    for (int i = 0; i < oldPrinterCount; i++) {
        PrinterHolder printerHolder = mPrinterHolders.get(i);
        PrinterId oldPrinterId = printerHolder.printer.getId();
        PrinterInfo updatedPrinter = newPrintersMap.remove(oldPrinterId);
 
        if (updatedPrinter != null) {
            printerHolder.printer = updatedPrinter;
            printerHolder.removed = false;
            onPrinterAvailable(printerHolder.printer);
            newPrinterHolders.add(printerHolder);
        } else if (mCurrentPrinter != null && mCurrentPrinter.getId().equals(oldPrinterId)){
            printerHolder.removed = true;
            onPrinterUnavailable(printerHolder.printer);
            newPrinterHolders.add(printerHolder);
        }
    }
 
    // Add the rest of the new printers, i.e. what is left.
    addPrinters(newPrinterHolders, newPrintersMap.values());
 
    mPrinterHolders.clear();
    mPrinterHolders.addAll(newPrinterHolders);
 
    notifyDataSetChanged();
}

// Add the rest of the new printers, i.e. what is left.   添加剩下的新打印机,即剩余的打印机

1
2
3
4
5
6
private void addPrinters(List<PrinterHolder> list, Collection<PrinterInfo> printers) {
    for (PrinterInfo printer : printers) {
        PrinterHolder printerHolder = new PrinterHolder(printer);
        list.add(printerHolder);
    }
}

判断是否存在有 HP打印机的设备 打印状态是否就绪

STATUS_BUSY、STATUS_IDLE、STATUS_UNAVAILABLE三种状态,只有打印机处于STATUS_IDLE时,系统才允许使用该打印机

1
2
3
4
5
6
7
8
//printer_flag                 
for (int i = 0;i < printers.size(); i++) {
    Log.d("gatsby", "onPrintersChanged i->" + i + " printers ->" + printers.get(i).toString() );             
    PrinterInfo xh_printer = printers.get(i);                                                          
    if(xh_printer.getName().startsWith("HP") && xh_printer.getStatus() == PrinterInfo.STATUS_IDLE ){
      printer_flag = true;
    }  
}

2.5.onLoadFinished  创建的加载器已经完成其加载过程后被调用  mDestinationSpinnerAdapter.notifyDataSetChanged();

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
@Override
public void onLoadFinished(Loader<List<PrintServiceInfo>> loader,
        List<PrintServiceInfo> services) {
    ComponentName newAdvancedPrintOptionsActivity = null;
    if (mCurrentPrinter != null && services != null) {
        final int numServices = services.size();
        for (int i = 0; i < numServices; i++) {
            PrintServiceInfo service = services.get(i);
 
            if (service.getComponentName().equals(mCurrentPrinter.getId().getServiceName())) {
                String advancedOptionsActivityName = service.getAdvancedOptionsActivityName();
 
                if (!TextUtils.isEmpty(advancedOptionsActivityName)) {
                    newAdvancedPrintOptionsActivity = new ComponentName(
                            service.getComponentName().getPackageName(),
                            advancedOptionsActivityName);
 
                    break;
                }
            }
        }
    }
 
    if (!Objects.equals(newAdvancedPrintOptionsActivity, mAdvancedPrintOptionsActivity)) {
        mAdvancedPrintOptionsActivity = newAdvancedPrintOptionsActivity;
        updateOptionsUi();
    }
 
    boolean newArePrintServicesEnabled = services != null && !services.isEmpty();
    if (mArePrintServicesEnabled != newArePrintServicesEnabled) {
        mArePrintServicesEnabled = newArePrintServicesEnabled;
 
        // Reload mDestinationSpinnerAdapter as mArePrintServicesEnabled changed and the adapter
        // reads that in DestinationAdapter#getMoreItemTitle
        if (mDestinationSpinnerAdapter != null) {
            mDestinationSpinnerAdapter.notifyDataSetChanged();
        }
    }
} 

2.6.onChanged在数据变化之后 默认第一个打印机设备 mDestinationSpinner.setSelection  并且更新设备属性 updateOptionsUi

第一次是默认 保存为PDF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            Log.d("gatsby","PrintersObserver printer_flag -> "+printer_flag);
            Log.d("gatsby","PrintersObserver getSelectedItem-> "+mDestinationSpinner.getSelectedItem().toString());
            Log.d("gatsby","PrintersObserver printerHolder-> "+printerHolder.toString());
            if (mDestinationSpinner.getSelectedItem() != printerHolder) {
                Log.d("gatsby","PrintersObserver setSelection->"+
                       mDestinationSpinnerAdapter.getPrinterIndex(newPrinterState.getId()));
                mDestinationSpinner.setSelection(
                        mDestinationSpinnerAdapter.getPrinterIndex(newPrinterState.getId()));
            }
 
 
12-16 16:51:20.421  1172  1172 D gatsby  : PrintersObserver onChanged->false
12-16 16:51:20.422  1172  1172 D gatsby  : PrintersObserver getSelectedItem->com.android.printspooler.ui.PrintActivity$PrinterHolder@d3279cf
12-16 16:51:20.422  1172  1172 D gatsby  : PrintersObserver printerHolder->com.android.printspooler.ui.PrintActivity$PrinterHolder@4b51f5c
12-16 16:51:20.422  1172  1172 D gatsby  : PrintersObserver setSelection->1
12-16 16:51:20.422  1172  1172 D gatsby  : onPrintersChanged i->0 printers ->PrinterInfo{id=PrinterId{serviceName=com.hp.android.printservice/com.hp.android.printservice.ServiceAndroidPrint, localId=net:/hpb0227a546f62.local.-HPB0227A546F62%20(HP%20Color%20Laser%20150)/HPB0227A546F62.local.}, name=HPB0227A546F62 (HP Color Laser 150), status=1, description=192.168.1.103, capabilities=null, iconResId=2131623939, hasCustomPrinterIcon=false, customPrinterIconGen=0, infoIntent=PendingIntent{dd49265: android.os.BinderProxy@73b4b3a}"}
12-16 16:51:20.422  1172  1172 D gatsby  : onPrintersChanged i->1 printers ->PrinterInfo{id=PrinterId{serviceName=com.hp.android.printservice/com.hp.android.printservice.ServiceAndroidPrint, localId=/dev/hpusb/CNB3P59KWG}, name=USB:HP Color Laser 150, status=3, description=USB, capabilities=null, iconResId=0, hasCustomPrinterIcon=false, customPrinterIconGen=0, infoIntent=null"}
12-16 16:51:20.422  1172  1172 D gatsby  : PrintersObserver onChanged->true
12-16 16:51:20.422  1172  1172 D gatsby  : PrintersObserver getSelectedItem->com.android.printspooler.ui.PrintActivity$PrinterHolder@4b51f5c
12-16 16:51:20.422  1172  1172 D gatsby  : PrintersObserver printerHolder->com.android.printspooler.ui.PrintActivity$PrinterHolder@4b51f5c
12-16 16:51:24.893  1172  1172 D gatsby  : DestinationSpinnerSelection confirmPrint will print

mDestinationSpinnerAdapter  数据的观察者

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
    private final class PrintersObserver extends DataSetObserver {
        @Override
        public void onChanged() {
            PrinterInfo oldPrinterState = mCurrentPrinter;
            if (oldPrinterState == null) {
                return;
            }
 
            PrinterHolder printerHolder = mDestinationSpinnerAdapter.getPrinterHolder(
                    oldPrinterState.getId());
            PrinterInfo newPrinterState = printerHolder.printer;
 
            if (printerHolder.removed) {
                onPrinterUnavailable(newPrinterState);
            }
 
            if (mDestinationSpinner.getSelectedItem() != printerHolder) {
                mDestinationSpinner.setSelection(
                        mDestinationSpinnerAdapter.getPrinterIndex(newPrinterState.getId()));
            }
………………………………………………
            if (capabChanged && hasCapab) {
                updatePrintAttributesFromCapabilities(newCapab);
            }
………………………………………………
            // Force a reload of the enabled print services to update mAdvancedPrintOptionsActivity
            // in onLoadFinished();
            getLoaderManager().getLoader(LOADER_ID_ENABLED_PRINT_SERVICES).forceLoad();
 
            updateOptionsUi();
            updateSummary();
        }

 updatePrintAttributesFromCapabilities  传入打印参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    private void updatePrintAttributesFromCapabilities(PrinterCapabilitiesInfo capabilities) {
        boolean clearRanges = false;
        PrintAttributes defaults = capabilities.getDefaults();
 
        // Sort the media sizes based on the current locale.
        List<MediaSize> sortedMediaSizes = new ArrayList<>(capabilities.getMediaSizes());
        Collections.sort(sortedMediaSizes, mMediaSizeComparator);
 
        PrintAttributes attributes = mPrintJob.getAttributes();
 
        // Media size.
        MediaSize currMediaSize = attributes.getMediaSize();
        if (currMediaSize == null) {
            clearRanges = true;
            attributes.setMediaSize(defaults.getMediaSize());
        }
……………………………………

  三.无预览打印

3.1.直接打印 无预览打印页界面面 a.只允许惠普打印机  b.吐司提示 打印机 即将打印   c.打印过程中关闭触摸、鼠标  若离众生苦 难悟人间道

解决思路:1.透明化预览界面  2.spinner 默认选择打印型号

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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
--- a/frameworks/base/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/frameworks/base/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -84,6 +84,9 @@ import android.widget.ImageView;
 import android.widget.Spinner;
 import android.widget.TextView;
  
+import android.view.WindowManager;
+import android.os.SystemProperties;
+
 import android.widget.Toast;
 import com.android.internal.logging.MetricsLogger;
 import com.android.printspooler.R;
@@ -239,12 +242,17 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
  
     /** Is doFinish() already in progress */
     private boolean mIsFinishing;
+  
+   private PrinterInfo xh_printer;
+   private boolean printer_flag = false;
+   private boolean printer_status = false;
+   private int xh_printer_id; 
  
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
  
-        setTitle(R.string.print_dialog);
+        //setTitle(R.string.print_dialog);
  
         Bundle extras = getIntent().getExtras();
  
@@ -347,6 +355,13 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
         ensurePreviewUiShown();
  
         setState(STATE_CONFIGURING);
+      
+       SystemProperties.set("persist.sys.UsbMouse","1");
+      
+       WindowManager.LayoutParams lp = getWindow().getAttributes();
+       lp.alpha = 0f;
+       getWindow().setAttributes(lp); 
+      
     }
  
     @Override
@@ -636,7 +651,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
         if (mPrintedDocument != null) {
             mPrintedDocument.cancel(true);
         }
-
+       Log.d("gatsby","PrintActivity onDestroy ");
         doFinish();
  
         super.onDestroy();
@@ -1256,7 +1271,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
         mCopiesEditText.setSelection(mCopiesEditText.getText().length());
         mCopiesEditText.addTextChangedListener(new EditTextWatcher());
  
-        // Destination.
+        // Destination. Gatsby Destination Spinner
         mPrintersObserver = new PrintersObserver();
         mDestinationSpinnerAdapter.registerDataSetObserver(mPrintersObserver);
         mDestinationSpinner = (Spinner) findViewById(R.id.destination_spinner);
@@ -1346,8 +1361,35 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
                 }
             });
         }
+      
+       DestinationSpinnerSelection();
     }
  
+       private void DestinationSpinnerSelection() {
+                                      
+               new Handler().postDelayed(new Runnable(){
+               @Override
+                   public void run() {
+                                                              
+                       if(printer_flag){                                                                          
+                           updateOptionsUi();                                                                     
+                           confirmPrint();            
+                           Log.d("gatsby", "DestinationSpinnerSelection confirmPrint will print");
+                          
+                           Toast.makeText(PrintActivity.this,
+                                   getResources().getString(R.string.print_will), Toast.LENGTH_LONG).show();                      
+                       }else {                        
+                           Toast.makeText(PrintActivity.this,
+                                   getResources().getString(R.string.print_noDevice), Toast.LENGTH_LONG).show();
+                       }
+                      
+                       SystemProperties.set("persist.sys.UsbMouse","0");                                          
+                   }
+               }, 5000);          
+        }
+
+
+
     @Override
     public Loader<List<PrintServiceInfo>> onCreateLoader(int id, Bundle args) {
         return new PrintServicesLoader((PrintManager) getSystemService(Context.PRINT_SERVICE), this,
@@ -1486,6 +1528,8 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
                     })
                     .setNegativeButton(android.R.string.cancel, null);
  
+           Log.d("gatsby","PrintActivity AlertDialog print_service");
+
             return builder.create();
         }
  
@@ -2219,7 +2263,8 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
             edit.apply();
         }
     }
-
+  
+   //Gatsby DestinationAdapter  Adapter Start
     private final class DestinationAdapter extends BaseAdapter
             implements PrinterRegistry.OnPrintersChangeListener {
         private final List<PrinterHolder> mPrinterHolders = new ArrayList<>();
@@ -2464,6 +2509,10 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
             for (int i = 0; i < printerCount; i++) {
                 PrinterInfo printer = printers.get(i);
                 newPrintersMap.put(printer.getId(), printer);
+               //Log.d("gatsby", "onPrintersChanged i-> " + i + " printers -> " + printers.get(i).toString());
+               if(printer.getName().startsWith("HP") && printer.getStatus() == PrinterInfo.STATUS_IDLE ){
+                 printer_status = true;
+               }              
             }
  
             List<PrinterHolder> newPrinterHolders = new ArrayList<>();
@@ -2495,6 +2544,20 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
             mPrinterHolders.addAll(newPrinterHolders);
  
             notifyDataSetChanged();
+                      
+           for (int i = 0; i < getCount(); i++) {
+               PrinterHolder xh_printerHolder = (PrinterHolder) getItem(i);
+               if(xh_printerHolder != null ){
+                   String xh_printer_title = xh_printerHolder.printer.getName();          
+                   Log.d("gatsby","xh_printerHolder i-> "+ i +" -> "+xh_printer_title);             
+                   if(xh_printer_title.contains("(HP Color Laser 150)") && printer_status){
+                       Log.d("gatsby","printerHolder -> "+xh_printer_title+" getStatus-> "+printer_status);
+                       printer_flag = true;
+                       xh_printer_id = i;                                     
+                   }              
+               }                                      
+           }
+          
         }
  
         @Override
@@ -2538,6 +2601,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
             return false;
         }
  
+       //gatsby addPrinters
         private void addPrinters(List<PrinterHolder> list, Collection<PrinterInfo> printers) {
             for (PrinterInfo printer : printers) {
                 PrinterHolder printerHolder = new PrinterHolder(printer);
@@ -2570,6 +2634,8 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
         }
     }
  
+   //Gatsby DestinationAdapter  Adapter End
+
     private final class PrintersObserver extends DataSetObserver {
         @Override
         public void onChanged() {
@@ -2577,7 +2643,8 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
             if (oldPrinterState == null) {
                 return;
             }
-
+          
+           Log.d("gatsby","PrintersObserver oldPrinterState.getId()-> "+oldPrinterState.getId());
             PrinterHolder printerHolder = mDestinationSpinnerAdapter.getPrinterHolder(
                     oldPrinterState.getId());
             PrinterInfo newPrinterState = printerHolder.printer;
@@ -2586,10 +2653,17 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
                 onPrinterUnavailable(newPrinterState);
             }
  
-            if (mDestinationSpinner.getSelectedItem() != printerHolder) {
+            /*if (mDestinationSpinner.getSelectedItem() != printerHolder) {
                 mDestinationSpinner.setSelection(
                         mDestinationSpinnerAdapter.getPrinterIndex(newPrinterState.getId()));
-            }
+            }*/
+           Log.d("gatsby","PrintersObserver printer_flag -> "+printer_flag +" xh_printer_id ->"+xh_printer_id); 
+           if (printer_flag) {            
+               mDestinationSpinner.setSelection(xh_printer_id);                           
+            }else {
+                mDestinationSpinner.setSelection(
+                        mDestinationSpinnerAdapter.getPrinterIndex(newPrinterState.getId()));             
+           }
  
             if (oldPrinterState.equals(newPrinterState)) {
                 return;
@@ -2673,7 +2747,8 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
                     startSelectPrinterActivity();
                     return;
                 }
-
+              
+               //gatsby  currentPrinter
                 PrinterHolder currentItem = (PrinterHolder) mDestinationSpinner.getSelectedItem();
                 PrinterInfo currentPrinter = (currentItem != null) ? currentItem.printer : null;
  
@@ -3102,6 +3177,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
             PageRange previousRange = null;
  
             PageRange[] printedPages = printJob.getPages();
+           if(printedPages != null && printedPages.length != 0){
             final int rangeCount = printedPages.length;
             for (int i = 0; i < rangeCount; i++) {
                 PageRange range = printedPages[i];
@@ -3130,6 +3206,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
  
                 previousRange = range;
             }
+           }
  
             PageRange[] result = new PageRange[rangesToShred.size()];
             rangesToShred.toArray(result);

  原始真章

 3.2. 惠普打印机 cp /mmt/sdcard/test.pdf /dev/usb/lp0  调出/dev/usb/lp0 节点  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--- a/system/core/init/devices.cpp
+++ b/system/core/init/devices.cpp
@@ -699,10 +699,17 @@ static void handle_generic_device_event(struct uevent *uevent)
                  make_dir(devpath, 0755);
                  snprintf(devpath, sizeof(devpath), "/dev/bus/usb/%03d/%03d", bus_id, device_id);
              }
-         }else if (!strncmp(uevent->subsystem, "usbmisc", 7)) { 
-                           base = "/dev/";    
-                }
-                 else {
+         }else if (!strncmp(uevent->subsystem, "usbmisc", 7)) {
+           ERROR("gatsby uevent->subsystem is %s\n",uevent->subsystem);
+           ERROR("gatsby uevent->device_name is %s\n",uevent->device_name);
+               if(!strncmp(uevent->device_name,"usb/lp",6)){
+                   base = "/dev/usb/";
+                   make_dir(base, 0755);  
+               }else{
+                   return;
+               }             
+      
+       } else {
              /* ignore ot

  

  

 

posted @   CrushGirl  阅读(1788)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
历史上的今天:
2020-11-17 RK:调试4G模块 WH-G405tf
点击右上角即可分享
微信分享提示