首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >takePicture与CameraSource失败

takePicture与CameraSource失败
EN

Stack Overflow用户
提问于 2022-06-28 08:31:31
回答 1查看 72关注 0票数 0

我使用条形码扫描器,当它完成时,我需要条形码。我以这个例子为例:https://harshitabambure.medium.com/barcode-scanner-and-qr-code-scanner-android-kotlin-b911b1299f65和扫描仪工作得很好,但是我添加的保存图片的功能不起作用,然后崩溃了:

代码语言:javascript
复制
cameraSource.takePicture

日志:

代码语言:javascript
复制
java.lang.RuntimeException: takePicture failed
    at android.hardware.Camera.native_takePicture(Native Method)
    at android.hardware.Camera.takePicture(Camera.java:1508)
    at com.google.android.gms.vision.CameraSource.takePicture(com.google.android.gms:play-services-vision-common@@19.1.3:60)
    at com.example.barcodetst1.MainActivity$setupControls$2.receiveDetections$lambda-2(MainActivity.kt:106)
    at com.example.barcodetst1.MainActivity$setupControls$2.$r8$lambda$7MpLFBTAl5Z8Yg1xMhYmW99yc8s(Unknown Source:0)
    at com.example.barcodetst1.MainActivity$setupControls$2$$ExternalSyntheticLambda2.run(Unknown Source:2)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7842)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

主要班:

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {
private val requestCodeCameraPermission = 1001
private lateinit var cameraSource: CameraSource
private lateinit var barcodeDetector: BarcodeDetector
private var scannedValue = ""
private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)


    if (ContextCompat.checkSelfPermission(this@MainActivity, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        askForCameraPermission()
    } else {
        setupControls()
    }

    val aniSlide: Animation = AnimationUtils.loadAnimation(this@MainActivity, R.anim.scanner_animation)
    binding.barcodeLine.startAnimation(aniSlide)
}


private fun setupControls() {
    barcodeDetector = BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.ALL_FORMATS).build()

    cameraSource = CameraSource.Builder(this, barcodeDetector)
        .setRequestedPreviewSize(1920, 1080)
        .setAutoFocusEnabled(true) //you should add this feature
        .build()

    binding.cameraSurfaceView.holder.addCallback(object : SurfaceHolder.Callback {
        @SuppressLint("MissingPermission")
        override fun surfaceCreated(holder: SurfaceHolder) {
            try {
                //Start preview after 1s delay
                cameraSource.start(holder)
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }

        @SuppressLint("MissingPermission")
        override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
            try {
                cameraSource.start(holder)
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }

        override fun surfaceDestroyed(holder: SurfaceHolder) {
            cameraSource.stop()
        }
    })


    barcodeDetector.setProcessor(object : Detector.Processor<Barcode> {
        override fun release() {
            Toast.makeText(applicationContext, "Scanner has been closed", Toast.LENGTH_SHORT)
                .show()
        }

        override fun receiveDetections(detections: Detections<Barcode>) {
            val barcodes = detections.detectedItems
            if (barcodes.size() == 1) {
                scannedValue = barcodes.valueAt(0).rawValue

                //Don't forget to add this line printing value or finishing activity must run on main thread
                runOnUiThread {

                    Toast.makeText(this@MainActivity, "value- $scannedValue", Toast.LENGTH_SHORT).show()
                    //Save Image
                    cameraSource.takePicture(null) {
                        val bmp = BitmapFactory.decodeByteArray(it, 0, it.size)
                        binding.imageViewTest.setImageBitmap(Bitmap.createScaledBitmap(bmp, binding.imageViewTest.width, binding.imageViewTest.height, false))

                    }
                    //cameraSource.stop()
                }
            } else {
                Toast.makeText(this@MainActivity, "value- else", Toast.LENGTH_SHORT).show()

            }
        }
    })
}

private fun askForCameraPermission() {
    ActivityCompat.requestPermissions(
        this@MainActivity,
        arrayOf(android.Manifest.permission.CAMERA),
        requestCodeCameraPermission
    )
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == requestCodeCameraPermission && grantResults.isNotEmpty()) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            setupControls()
        } else {
            Toast.makeText(applicationContext, "Permission Denied", Toast.LENGTH_SHORT).show()
        }
    }
}

override fun onDestroy() {
    super.onDestroy()
    cameraSource.stop()
}


}
EN

回答 1

Stack Overflow用户

发布于 2022-06-28 09:41:19

代码语言:javascript
复制
please try this
<code> 
  private void showCameraDialogShopImage() {
    final CharSequence[] items = {"Take Photo",
            "Cancel"};
    AlertDialog.Builder builder = new AlertDialog.Builder(KycVerifyDetails.this);
    builder.setTitle("Change Shop Image");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Take Photo")) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                    //Check permissions for Android 6.0+
                    if(!checkExternalStoragePermission()){
                        return;
                    }
                }
                values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, "MyPicture");
                values.put(MediaStore.Images.Media.DESCRIPTION, "Photo taken on " + System.currentTimeMillis());
                imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, PICTURE_RESULTSHOPIMAGE);

            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                showCameraDialog();
                getLastLocation();
            } else {
                //code for deny
            }
            break;
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
       
            //shop image
        case PICTURE_RESULTSHOPIMAGE:
            if (requestCode == PICTURE_RESULTSHOPIMAGE){
                if (resultCode == Activity.RESULT_OK) {
                    try {
                        thumbnailShopImage = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                        shopviewImage.setImageBitmap(thumbnailShopImage);
                        latitudeTxt.setText("Latitude  : "+latitudeStr);
                        longitudeTxt.setText("Longitude : "+longitudeStr);
                        imageurl = getRealPathFromURI(imageUri);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }
    


    }
}



public String getPathFromURI(Uri contentUri) {
    String res = null;
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor.moveToFirst()) {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}
public String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(contentUri, proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

private boolean checkExternalStoragePermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        Log.i(TAG, "Permission not granted.");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 225);
    } else {
        Log.i(TAG, "You already have permission!");
        return true;
    }

    return false;
}

  


@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static boolean checkPermission(final Context context) {
    int currentAPIVersion = Build.VERSION.SDK_INT;
    if (currentAPIVersion >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                android.app.AlertDialog.Builder alertBuilder = new android.app.AlertDialog.Builder(context);
                alertBuilder.setCancelable(true);
                alertBuilder.setTitle("Permission necessary");
                alertBuilder.setMessage("External storage permission is necessary");
                alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
                    }
                });
                android.app.AlertDialog alert = alertBuilder.create();
                alert.show();
            } else {
                ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
            }
            return false;
        } else {
            return true;
        }
    } else {
        return true;
    }
}

</code>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72783170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档