Android中的Wifi打印无法正常工作

时间:2015-05-14 10:08:48

标签: android printing android-wifi

我已经制作了一个Android应用程序,用于使用连接到wifi的打印机打印pdf文件。我已经尝试过以下代码,它只搜索设备但没有发生任何事情。请查看我的代码并告诉我应该采取哪些措施来解决我的问题。任何输入将不胜感激!

public class MainActivity extends Activity {

    public int pageHeight;
    public int pageWidth;
    public PdfDocument myPdfDocument;
    public int totalpages = 4;

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

    }

    public class MyPrintDocumentAdapter extends PrintDocumentAdapter {
        Context context;

        public MyPrintDocumentAdapter(Context context) {
            this.context = context;

        }

        @SuppressLint("InlinedApi")
        @Override
        public void onLayout(PrintAttributes oldAttributes,
                PrintAttributes newAttributes,
                CancellationSignal cancellationSignal,
                LayoutResultCallback callback, Bundle metadata) {
            myPdfDocument = new PrintedPdfDocument(context, newAttributes);

            pageHeight = newAttributes.getMediaSize().getHeightMils() / 1000 * 72;
            pageWidth = newAttributes.getMediaSize().getWidthMils() / 1000 * 72;

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

            if (totalpages > 0) {
                PrintDocumentInfo.Builder builder = new PrintDocumentInfo.Builder(
                        "print_output.pdf").setContentType(
                        PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).setPageCount(
                        totalpages);

                PrintDocumentInfo info = builder.build();
                callback.onLayoutFinished(info, true);
            } else {
                callback.onLayoutFailed("Page count is zero.");
            }
        }

        @Override
        public void onWrite(final PageRange[] pageRanges,
                final ParcelFileDescriptor destination,
                final CancellationSignal cancellationSignal,
                final WriteResultCallback callback) {
            for (int i = 0; i < totalpages; i++) {
                if (pageInRange(pageRanges, i)) {
                    PageInfo newPage = new PageInfo.Builder(pageWidth,
                            pageHeight, i).create();

                    PdfDocument.Page page = myPdfDocument.startPage(newPage);

                    if (cancellationSignal.isCanceled()) {
                        callback.onWriteCancelled();
                        myPdfDocument.close();
                        myPdfDocument = null;
                        return;
                    }
                    drawPage(page, i);
                    myPdfDocument.finishPage(page);
                }
            }

            try {
                myPdfDocument.writeTo(new FileOutputStream(destination
                        .getFileDescriptor()));
            } catch (IOException e) {
                callback.onWriteFailed(e.toString());
                return;
            } finally {
                myPdfDocument.close();
                myPdfDocument = null;
            }

            callback.onWriteFinished(pageRanges);
        }

        private boolean pageInRange(PageRange[] pageRanges, int page) {
            for (int i = 0; i < pageRanges.length; i++) {
                if ((page >= pageRanges[i].getStart())
                        && (page <= pageRanges[i].getEnd()))
                    return true;
            }
            return false;
        }

        private void drawPage(PdfDocument.Page page, int pagenumber) {
            Canvas canvas = page.getCanvas();

            pagenumber++; // Make sure page numbers start at 1

            int titleBaseLine = 72;
            int leftMargin = 54;

            Paint paint = new Paint();
            paint.setColor(Color.BLACK);
            paint.setTextSize(40);
            canvas.drawText("Test Print Document Page " + pagenumber,
                    leftMargin, titleBaseLine, paint);

            paint.setTextSize(14);
            canvas.drawText(
                    "This is some test content to verify that custom document printing works",
                    leftMargin, titleBaseLine + 35, paint);

            if (pagenumber % 2 == 0)
                paint.setColor(Color.RED);
            else
                paint.setColor(Color.GREEN);

            PageInfo pageInfo = page.getInfo();

            canvas.drawCircle(pageInfo.getPageWidth() / 2,
                    pageInfo.getPageHeight() / 2, 150, paint);
        }
    }

    @SuppressLint("InlinedApi")
    public void printDocument(View view) {
        PrintManager printManager = (PrintManager) this
                .getSystemService(Context.PRINT_SERVICE);

        String jobName = this.getString(R.string.app_name) + " Document";

        printManager.print(jobName, new MyPrintDocumentAdapter(this), null);
    }

}

1 个答案:

答案 0 :(得分:0)

你可以参考这个Android-wifi-print - GitHub。我已经创建了一个打印的演示应用程序.. 这是我的流程。!这会对你有所帮助。

在以下链接的帮助下,我创建了这个。

这是原型的流程。

  1. 检查连接性。
  2. 如果在WiFi中连接..我正在存储该WiFi配置。
  3. 现在检查我是否已经有打印机信息(WiFi打印机的WiFi配置)可用。如果可用,我将扫描并获取WiFi ScanResults的列表并连接到其他..它将显示WiFi列表并单击它,用户将连接到打印机并存储该WiFi配置以用于将来的打印作业。
  4. 打印作业完成后,我将连接到之前的WiFi或移动数据连接。
  5. 现在回到第2步。
  6. 如果用户在移动数据中连接,我只是启用WiFi并执行第3步。
  7. 打印作业完成后,我只是禁用WiFi。这样,我们将连接回移动数据连接。 (那是android的默认值)。
  8. 如果您要打印文件,只需在 PrintUtility.class 中调用打印(文件) 下课将负责所有印刷工作..

    public class PrintUtility implements Observer {
    
        private static final int TIME_OUT = 10000;
        private static final int CONNECTION_TIME_OUT = 5000;
    
        private Activity mActivity;
        private Fragment mFragment = null;
    
        private WifiConfiguration mPrinterConfiguration;
        private WifiConfiguration mOldWifiConfiguration;
        private WifiManager mWifiManager;
        private WifiScanner mWifiScanner;
        private List<ScanResult> mScanResults = new ArrayList<ScanResult>();
    
        private PrintManager mPrintManager;
        private List<PrintJob> mPrintJobs;
        private PrintJob mCurrentPrintJob;
    
        private File pdfFile;
        private String externalStorageDirectory;
    
        private Handler mPrintStartHandler = new Handler();
        private Handler mPrintCompleteHandler = new Handler();
        private Handler mWifiConnectHandler = new Handler();
        private String connectionInfo;
    
        private boolean isMobileDataConnection = false;
    
        private PrintCompleteService mPrintCompleteService;
    
        //    Observer pattern
        private Observable mObservable;
    
    
        public PrintUtility(Activity mActivity, WifiManager mWifiManager, WifiScanner mWifiScanner) {
            this.mActivity = mActivity;
            this.mWifiManager = mWifiManager;
            this.mWifiScanner = mWifiScanner;
            mPrintCompleteService = (PrintCompleteService) mActivity;
            mObservable = ObservableSingleton.getInstance();
            mObservable.attach(this);
        }
    
        public PrintUtility(Activity mActivity, Fragment mFragment, WifiManager mWifiManager, WifiScanner mWifiScanner) {
            this.mActivity = mActivity;
            this.mFragment = mFragment;
            this.mWifiManager = mWifiManager;
            this.mWifiScanner = mWifiScanner;
            mPrintCompleteService = (PrintCompleteService) mFragment;
            mObservable = ObservableSingleton.getInstance();
            mObservable.attach(this);
        }
    
        public void downloadAndPrint(String fileUrl, final String fileName) {
    
            new FileDownloader(mActivity, fileUrl, fileName) {
                @Override
                protected void onPostExecute(Boolean result) {
    
                    if (!result) {
                        mObservable.notifyObserver(true);
                    } else {
    
                        // print flow will come here.
    
                        try {
                            externalStorageDirectory = Environment.getExternalStorageDirectory().toString();
                            File folder = new File(externalStorageDirectory, Constants.CONTROLLER_PDF_FOLDER);
                            pdfFile = new File(folder, fileName);
                        } catch (Exception e) {
                            mObservable.notifyObserver(true);
                            e.printStackTrace();
                        }
    
                        print(pdfFile);
    
                    }
    
                }
            }.execute("");
        }
    
        public void print(final File pdfFile) {
    
            this.pdfFile = pdfFile;
    
            // check connectivity info -> mobile or wifi.
            connectionInfo = Util.connectionInfo(mActivity);
    
            if (connectionInfo.equalsIgnoreCase(Constants.CONTROLLER_MOBILE)) {
                // follow mobile flow.
                isMobileDataConnection = true;
    
                if (mWifiManager.isWifiEnabled() == false) {
                    mWifiManager.setWifiEnabled(true);
                }
    
                mWifiManager.startScan();
                setScanResults(mWifiScanner.getScanResults());
    
                printerConfiguration();
    
            } else if (connectionInfo.equalsIgnoreCase(Constants.CONTROLLER_WIFI)) {
                // follow wifi flow..
    
                // this will get current wifiInfo and store it in shared preference.
                Util.storeCurrentWiFiConfiguration(mActivity);
    
                printerConfiguration();
    
            } else {
                mObservable.notifyObserver(true);
            }
    
        }
    
        private void printerConfiguration() {
    
            // check printer detail is available or not.
            mPrinterConfiguration = Util.getWifiConfiguration(mActivity, Constants.CONTROLLER_PRINTER);
    
            if (mPrinterConfiguration == null) {
                // printer configuration is not available.
                // display list of wifi available in an activity
    
                showWifiListActivity(Constants.REQUEST_CODE_PRINTER);
    
            } else {
                // get list of wifi available. if printer configuration available then connect it.
                // else.. show list of available wifi nearby.
    
                boolean isPrinterAvailable = false;
    
                // scans nearby wifi..
                mWifiManager.startScan();
                setScanResults(mWifiScanner.getScanResults());
    
    
                // checks this wifi in scan result list..
                for (int i = 0; i < mScanResults.size(); i++) {
                    if (mPrinterConfiguration.SSID.equals("\"" + mScanResults.get(i).SSID + "\"")) {
                        isPrinterAvailable = true;
                        break;
                    }
                }
    
                if (isPrinterAvailable) {
    
                    // connect to printer wifi and show print settings dialog and continue with print flow.
                    connectToWifi(mPrinterConfiguration);
    
                    // prints document.
                    doPrint();
    
                } else {
                    showWifiListActivity(Constants.REQUEST_CODE_PRINTER);
                }
    
            }
        }
    
        private void showWifiListActivity(int requestCode) {
            Intent iWifi = new Intent(mActivity, WifiListActivity.class);
            mActivity.startActivityForResult(iWifi, requestCode);
        }
    
        private void connectToWifi(WifiConfiguration mWifiConfiguration) {
            mWifiManager.enableNetwork(mWifiConfiguration.networkId, true);
        }
    
        public void doPrint() {
    
            try {
                // it is taking some time to connect to printer.. so i used handler.. and waiting for its status.
                mPrintStartHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
    
                        mPrintStartHandler.postDelayed(this, TIME_OUT);
    
                        if (mPrinterConfiguration.status == WifiConfiguration.Status.CURRENT) {
                            if (mWifiManager.getConnectionInfo().getSupplicantState() == SupplicantState.COMPLETED) {
    
                                if (Util.computePDFPageCount(pdfFile) > 0) {
                                    printDocument(pdfFile);
                                } else {
    
                                    AlertDialog.Builder alert = new AlertDialog.Builder(mActivity);
    
                                    alert.setMessage("Can't print, Page count is zero.");
    
                                    alert.setNeutralButton("OK", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int i) {
                                            dialog.dismiss();
                                            switchConnection();
                                        }
                                    });
    
                                    alert.show();
                                }
                            }
                            mPrintStartHandler.removeCallbacksAndMessages(null);
                        } else {
                            Toast.makeText(mActivity, "Failed to connect to printer!.", Toast.LENGTH_LONG).show();
                            switchConnection();
                            mPrintStartHandler.removeCallbacksAndMessages(null);
                        }
                    }
                }, TIME_OUT);
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(mActivity, "Failed to connect to printer!.", Toast.LENGTH_LONG).show();
                switchConnection();
            }
        }
    
        @TargetApi(Build.VERSION_CODES.KITKAT)
        public void printDocument(File pdfFile) {
    
            mPrintManager = (PrintManager) mActivity.getSystemService(Context.PRINT_SERVICE);
    
            String jobName = mActivity.getResources().getString(R.string.app_name) + " Document";
    
            mCurrentPrintJob = mPrintManager.print(jobName, new PrintServicesAdapter(mActivity, mFragment, pdfFile), null);
        }
    
    
        @TargetApi(Build.VERSION_CODES.KITKAT)
        public void completePrintJob() {
            mPrintJobs = mPrintManager.getPrintJobs();
    
            mPrintCompleteHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
    
                    mPrintCompleteHandler.postDelayed(this, CONNECTION_TIME_OUT);
    
                    if (mCurrentPrintJob.getInfo().getState() == PrintJobInfo.STATE_COMPLETED) {
    
                        // remove that PrintJob from PrintManager.
                        for (int i = 0; i < mPrintJobs.size(); i++) {
                            if (mPrintJobs.get(i).getId() == mCurrentPrintJob.getId()) {
                                mPrintJobs.remove(i);
                            }
                        }
    
                        // switching back to previous connection..
                        switchConnection();
    
                        // stops handler..
                        mPrintCompleteHandler.removeCallbacksAndMessages(null);
                    } else if (mCurrentPrintJob.getInfo().getState() == PrintJobInfo.STATE_FAILED) {
                        switchConnection();
                        Toast.makeText(mActivity, "Print Failed!", Toast.LENGTH_LONG).show();
                        mPrintCompleteHandler.removeCallbacksAndMessages(null);
                    } else if (mCurrentPrintJob.getInfo().getState() == PrintJobInfo.STATE_CANCELED) {
                        switchConnection();
                        Toast.makeText(mActivity, "Print Cancelled!", Toast.LENGTH_LONG).show();
                        mPrintCompleteHandler.removeCallbacksAndMessages(null);
                    }
    
                }
            }, CONNECTION_TIME_OUT);
        }
    
        public void switchConnection() {
            try {
                if (!isMobileDataConnection) {
    
                    mOldWifiConfiguration = Util.getWifiConfiguration(mActivity, Constants.CONTROLLER_WIFI);
    
                    // get list of wifi available. if wifi configuration available then connect it.
                    // else.. show list of available wifi nearby.
                    boolean isWifiAvailable = false;
    
                    // scans nearby wifi.
                    mWifiManager.startScan();
                    setScanResults(mWifiScanner.getScanResults());
    
                    // checks this wifi in scan result list.
                    for (int i = 0; i < mScanResults.size(); i++) {
                        if (mOldWifiConfiguration.SSID.equals("\"" + mScanResults.get(i).SSID + "\"")) {
                            isWifiAvailable = true;
                            break;
                        }
                    }
    
                    if (isWifiAvailable) {
    
                        // connect to printer wifi and show print settings dialog and continue with print flow.
                        connectToWifi(mOldWifiConfiguration);
    
                        mWifiConnectHandler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mWifiConnectHandler.postDelayed(this, TIME_OUT);
                                if (mOldWifiConfiguration.status == WifiConfiguration.Status.CURRENT) {
                                    if (mWifiManager.getConnectionInfo().getSupplicantState() == SupplicantState.COMPLETED) {
    
                                        try {
                                            mObservable.notifyObserver(true);
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
    
                                        mWifiConnectHandler.removeCallbacksAndMessages(null);
                                    }
                                }
                            }
                        }, TIME_OUT);
    
                    } else {
                        showWifiListActivity(Constants.REQUEST_CODE_WIFI);
                    }
                } else {
                    mWifiManager.setWifiEnabled(false);
                    mObservable.notifyObserver(true);
                }
            } catch (Exception e) {
                mObservable.notifyObserver(true);
                e.printStackTrace();
            }
        }
    
        public void getPrinterConfigAndPrint() {
            mPrinterConfiguration = Util.getWifiConfiguration(mActivity, Constants.CONTROLLER_PRINTER);
            doPrint();
        }
    
        public void setScanResults(List<ScanResult> scanResults) {
            this.mScanResults = scanResults;
        }
    
        public void onPrintCancelled() {
            switchConnection();
        }
    
        @Override
        public void update() {
            mObservable.detach(this);
        }
    
        @Override
        public void updateObserver(boolean bool) {
    
        }
    
        @Override
        public void updateObserverProgress(int percentage) {
    
        }
    
    }