java - 尝试在空对象引用上调用虚拟方法“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 及其位置,但错误仍然存在。
解决方案
推荐阅读
- javascript - 无法在 mongodb shell 中进行 http-post
- ios - 检查用户名是否唯一抛出错误:void 函数中的意外非 void 返回类型
- javascript - 如何使用javascript检查输入是否包含特殊字符
- highcharts - 如何删除我在折线图中添加的条形图上的数字数据图?
- python-3.x - 仅针对给定坐标计算矩阵乘法
- ffmpeg - 同步 RTSP 音频和视频
- python - 如何在 RidgeCV 模型上应用 GridSearch
- c# - Lambda 在 Console.Writeline(s) 和 Log,Info(s) 之间切换
- firebase - 在 travis 中设置环境变量
- java - 数据 Jpa 测试无法加载属性