【问题标题】:open failed: EACCES (Permission denied) and Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference打开失败:EACCES(权限被拒绝)并尝试在空对象引用上调用虚拟方法“int android.graphics.Bitmap.getWidth()”
【发布时间】: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));
                }
                休息;
        }
    }

非常感谢您的帮助。

【问题讨论】:

标签: java android


【解决方案1】:

我遇到了类似的问题并用它来解决它: https://*.com/a/40623623/13826785

希望这会有所帮助!

【讨论】:

  • 谢谢先生,但是那个解决方案我应该在库中编辑它吗?
  • 是的,在发生错误的库中进行编辑。您可能还需要为高度这样做。
  • 我认为您可能必须将整个库方法替换为链接中发布的方法
最近更新 更多