我使用条形码扫描器,当它完成时,我需要条形码。我以这个例子为例:https://harshitabambure.medium.com/barcode-scanner-and-qr-code-scanner-android-kotlin-b911b1299f65和扫描仪工作得很好,但是我添加的保存图片的功能不起作用,然后崩溃了:
cameraSource.takePicture日志:
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)主要班:
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()
}
}发布于 2022-06-28 09:41:19
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>https://stackoverflow.com/questions/72783170
复制相似问题