首页 > 解决方案 > 尝试在空对象引用上调用虚拟方法“void dalvik.system.CloseGuard.warnIfOpen()”

问题描述

我正在开发打印应用程序,它只是从用户存储(屏幕截图文件夹)中获取令人兴奋的 pdf 并将其转换为图像然后打印它这是我尝试的代码

public class MainActivity extends AppCompatActivity {
private final String ACTION_USB_PERMISSION = "com.daudapp.printer.USB_PERMISSION";
PendingIntent mPermissionIntent;
UsbManager usbManager;
UsbDevice device;
UsbDevice printer = null;
//private static final int PRINTER_VENDOR_ID = 1008;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
EditText devicenames;
byte[] readBuffer;
int readBufferPosition;
volatile boolean stopWorker;
boolean printing;
int PRINTER_VENDOR_ID = 1008;
File pdfFile;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        setContentView(R.layout.activity_main);
        devicenames = (EditText)findViewById(R.id.devicename);
        pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ScreenShot/my.pdf");


        findViewById(R.id.button_usb_Print).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(devicenames.getText().toString().trim().length() > 0){
                            Log.i("Info", "Activity started");
                            usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
                            HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
                            if (deviceList.size() <= 0) {
                                Log.i("Info", "No device found");
                            } else {
                                Log.i("Info", "Number of device : " + deviceList.size());
                                Toast.makeText(MainActivity.this, "No of device : " + deviceList.size(), Toast.LENGTH_LONG).show();
                            }
                            Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
                            int count = 0;
                            mPermissionIntent = PendingIntent.getBroadcast(getBaseContext(), 0,
                                    new Intent(ACTION_USB_PERMISSION), 0);
                            while (deviceIterator.hasNext()) {
                                count++;
                                device = deviceIterator.next();
                                Log.i("info", "Device No " + count + "........");
                                Log.i("info", "Vendor id : " + device.getVendorId());
                                Log.i("info", "Product id : " + device.getProductId());
                                Log.i("info", "Device  name : " + device.getDeviceName());
                                Log.i("info", "Device class : " + device.getClass().getName());
                                Log.i("info", "Device protocol: " + device.getDeviceProtocol());
                                Log.i("info", "Device subclass : " + device.getDeviceSubclass());
                                if (device.getVendorId() == PRINTER_VENDOR_ID) {
                                    printer = device;
                                    break;
                                }
                            }
                            Log.i("Info", "Print command given");
                            IntentFilter filter = new IntentFilter(
                                    ACTION_USB_PERMISSION);
                            registerReceiver(mUsbReceiver, filter);
                            if (printer != null) {
                                usbManager.requestPermission(printer,
                                        mPermissionIntent);
                            } else {
                                Log.e("Exception", "Printer not found");
                                Toast.makeText(MainActivity.this, "No USB", Toast.LENGTH_LONG).show();
                                try {
                                    findBT();
                                    openBT();
                                    sendData();
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                            }
                        }
                        else{
                            Toast.makeText(MainActivity.this, "Enter device name", Toast.LENGTH_LONG).show();
                        }

                    }
                });

    } catch (Exception e) {
        Log.e("Exception", "Exception in onCreate " + e.getMessage());
        e.printStackTrace();
    }

}

private void findBT() {

    try {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        String pairedDeviceName = devicenames.getText().toString();
        if(mBluetoothAdapter == null) {
            Toast.makeText(MainActivity.this, "No bluetooth adapter available", Toast.LENGTH_LONG).show();
        }

        if(!mBluetoothAdapter.isEnabled()) {
            Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBluetooth, 0);
        }

        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

        if(pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                if (device.getName().equals(pairedDeviceName)) {
                    mmDevice = device;
                    Toast.makeText(MainActivity.this, "Bluetooth device found", Toast.LENGTH_LONG).show();
                    break;
                }
            }
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private  Bitmap pdfToBitmap(File pdfFile) {
    Bitmap bitmap=null;
    try {
        PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));


        PdfRenderer.Page page = renderer.openPage(0);

        int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
        int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight();
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);

        // close the page
        page.close();
        // close the renderer
        renderer.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return bitmap;

}

private void openBT() throws IOException {
    try {

        // Standard SerialPortService ID
        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
        mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
        mmSocket.connect();
        mmOutputStream = mmSocket.getOutputStream();
        mmInputStream = mmSocket.getInputStream();

        beginListenForData();

        Toast.makeText(MainActivity.this, "bluetooth Opened", Toast.LENGTH_LONG).show();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

void beginListenForData() {
    try {
        final Handler handler = new Handler();

        // this is the ASCII code for a newline character
        final byte delimiter = 10;

        stopWorker = false;
        readBufferPosition = 0;
        readBuffer = new byte[1024];

        workerThread = new Thread(new Runnable() {
            public void run() {

                while (!Thread.currentThread().isInterrupted() && !stopWorker) {

                    try {

                        int bytesAvailable = mmInputStream.available();

                        if (bytesAvailable > 0) {

                            byte[] packetBytes = new byte[bytesAvailable];
                            mmInputStream.read(packetBytes);

                            for (int i = 0; i < bytesAvailable; i++) {

                                byte b = packetBytes[i];
                                if (b == delimiter) {

                                    byte[] encodedBytes = new byte[readBufferPosition];
                                    System.arraycopy(
                                            readBuffer, 0,
                                            encodedBytes, 0,
                                            encodedBytes.length
                                    );

                                    // specify US-ASCII encoding
                                    final String data = new String(encodedBytes, "US-ASCII");
                                    readBufferPosition = 0;

                                    // tell the user data were sent to bluetooth printer device
                                    handler.post(new Runnable() {
                                        public void run() {

                                            Toast.makeText(MainActivity.this, data, Toast.LENGTH_LONG).show();
                                        }
                                    });

                                } else {
                                    readBuffer[readBufferPosition++] = b;
                                }
                            }
                        }

                    } catch (IOException ex) {
                        stopWorker = true;
                    }

                }
            }
        });

        workerThread.start();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
void sendData() throws IOException {
    try {

        // the text typed by the user
        Bitmap bitmap = pdfToBitmap(pdfFile);
        byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte) 255, 3};
        mmOutputStream.write(SELECT_BIT_IMAGE_MODE);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        mmOutputStream.write(byteArray);
        // tell the user data were sent

        Toast.makeText(MainActivity.this, "Data sent", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(MainActivity.this, "Cannot send data", Toast.LENGTH_LONG).show();
    }
}

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    final UsbDevice printerDevice = (UsbDevice) intent
                            .getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(
                            UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (printerDevice != null) {
                            Log.i("Info", "Device permission granted");
                            startPrinting(printerDevice);
                        }
                    } else {
                        Log.d("Debug", "permission denied for device "
                                + printerDevice);
                    }
                }
            }
        } catch (Exception e) {
            Log.e("Exception", "Exception in onRecieve " + e.getMessage());
            e.printStackTrace();
        }
    }

};

public void startPrinting(final UsbDevice printerDevice) {
    new Handler().post(new Runnable() {
        UsbDeviceConnection conn;
        UsbInterface usbInterface;

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void run() {
            try {
                Log.i("Info", "Bulk transfer started");
                usbInterface = printerDevice.getInterface(0);
                UsbEndpoint endPoint = usbInterface.getEndpoint(0);
                conn = usbManager.openDevice(printer);
                conn.claimInterface(usbInterface, true);
                Bitmap bitmap = pdfToBitmap(pdfFile);
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] byteArray = stream.toByteArray();
                ByteBuffer output_buffer = ByteBuffer
                        .allocate(byteArray.length);
                UsbRequest request = new UsbRequest();
                request.initialize(conn, endPoint);
                request.queue(output_buffer, byteArray.length);
                if (conn.requestWait() == request) {
                    Log.i("Info", output_buffer.getChar(0) + "");
                    Message m = new Message();
                    m.obj = output_buffer.array();
                    // handler.sendMessage(m);
                    output_buffer.clear();
                } else {
                    Log.i("Info", "No request recieved");
                }


            } catch (Exception e) {
                Log.e("Exception", "Unable to transfer bulk data");
                e.printStackTrace();
            } finally {
                try {
                    conn.releaseInterface(usbInterface);
                    Log.i("Info", "Interface released");
                    conn.close();
                    Log.i("Info", "Usb connection closed");
                    unregisterReceiver(mUsbReceiver);
                    Log.i("Info", "Brodcast reciever unregistered");
                } catch (Exception e) {
                    Log.e("Exception",
                            "Unable to release resources because : "
                                    + e.getMessage());
                    e.printStackTrace();
                }
            }

        }
    });
}

}

完整代码在这里,以便您可以运行代码并对其进行测试(在将测试 pdf 添加到路径之后:))

当我运行上面的应用程序时,它向我展示了“无法发送数据”,这是错误`

E/System: Uncaught exception thrown by finalizer
java.lang.NullPointerException: Attempt to invoke virtual method 'void dalvik.system.CloseGuard.warnIfOpen()' on a null object reference
    at android.graphics.pdf.PdfRenderer.finalize(PdfRenderer.java:210)
    at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:217)
    at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:200)
    at java.lang.Thread.run(Thread.java:818)

pdf 对正确的名称和路径感到兴奋,并且权限没有问题

我尝试更改 pdf 及其位置,但错误仍然存​​在。

标签: javaandroidprinting

解决方案


推荐阅读