【发布时间】:2025-11-21 15:45:02
【问题描述】:
我一直在堆栈中搜索此类问题,但找不到。所以我需要大家的帮助,谢谢。
我一直在使用库 com.blikoon.qrcodescanner 来扫描二维码。在我尝试将库和我的应用程序迁移到 androidx 之前,一切都很好。迁移后,错误如下所示。
2020-06-29 08:57:52.663 2306-2700/com.asset.assettag E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Screenshots Screenshot_2020-06-29-08-21-34-661_com.android.printspooler.jpg: open failed: EACCES (Permission denied)
2020-06-29 08:57:52.664 2306-2700/com.asset.assettag E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: com.asset.assettag, PID: 2306
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at com.blikoon.qrcodescanner.decode.DecodeImageThread.run(DecodeImageThread.java:29)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
2020-06-29 08:57:52.663 2306-2700/com.asset.assettag E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-29-08-21-34-661_com.android.printspooler.jpg: open failed: EACCES (Permission denied)
这是我的代码
public class ScanActivity extends AppCompatActivity {
private Button button;
private static final int REQUEST_CODE_QR_SCAN = 101;
private final String LOGTAG = "QRCScanner-ScanActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
button = (Button) findViewById(R.id.button_start_scan);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Start the qr scan activity
Intent i = new Intent(ScanActivity.this,QrCodeActivity.class);
startActivityForResult( i,REQUEST_CODE_QR_SCAN);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
Log.d(LOGTAG, "COULD NOT GET A GOOD RESULT.");
if (data == null)
return;
//Getting the passed result
String result = data.getStringExtra("com.blikoon.qrcodescanner.error_decoding_image");
if (result != null) {
AlertDialog alertDialog = new AlertDialog.Builder(ScanActivity.this).create();
alertDialog.setTitle("Scan Error");
alertDialog.setMessage("QR Code could not be scanned");
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
return;
}
if (requestCode == REQUEST_CODE_QR_SCAN) {
if (data == null)
return;
//Getting the passed result
String result = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
Log.d(LOGTAG, "Have scan result in your app activity :" + result);
AlertDialog alertDialog = new AlertDialog.Builder(ScanActivity.this).create();
alertDialog.setTitle("Scan result");
alertDialog.setMessage(result);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
}
}
这是库编码和问题定位。
public class DecodeImageThread implements Runnable {
private static final int MAX_PICTURE_PIXEL = 256;
private byte[] mData;
private int mWidth;
private int mHeight;
private String mImgPath;
private DecodeImageCallback mCallback;
public DecodeImageThread(String imgPath, DecodeImageCallback callback) {
this.mImgPath = imgPath;
this.mCallback = callback;
}
@Override
public void run() {
if (null == mData) {
if (!TextUtils.isEmpty(mImgPath)) {
Bitmap bitmap = QrUtils.decodeSampledBitmapFromFile(mImgPath, MAX_PICTURE_PIXEL, MAX_PICTURE_PIXEL);
this.mData = QrUtils.getYUV420sp(bitmap.getWidth(), bitmap.getHeight(), bitmap);
this.mWidth = bitmap.getWidth();
this.mHeight = bitmap.getHeight();
}
}
if (mData == null || mData.length == 0 || mWidth == 0 || mHeight == 0) {
if (null != mCallback) {
mCallback.decodeFail(0, "No image data");
}
return;
}
final Result result = QrUtils.decodeImage(mData, mWidth, mHeight);
if (null != mCallback) {
if (null != result) {
mCallback.decodeSucceed(result);
} else {
mCallback.decodeFail(0, "Decode image failed.");
}
}
}
}
更新库调用解码图像线程的方法
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
如果(结果代码!= RESULT_OK){
返回;
}
开关(请求代码){
案例请求图片:
结束();
休息;
案例 REQUEST_SYSTEM_PICTURE:
uri uri = data.getData();
字符串 imgPath = getPathFromUri(uri);
if (imgPath!=null && !TextUtils.isEmpty(imgPath) &&null != mQrCodeExecutor)
{
mQrCodeExecutor.execute(new DecodeImageThread(imgPath, mDecodeImageCallback));
}
休息;
}
}
非常感谢您的帮助。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。