Android截图 调用图片照片并截图,相机照相截图

       之前在网上搜的代码,都是返回data,通过data来显示图片并上传,可是在部分手机上照相机照相之后截图卡死了,之后我就不使用data来做后续的操作了,直接使用文件做后续操作,可是当改完之后又出现问题了,在小米和华为手机上调用图库的照片并截图也卡死了,为了解决这个问题,图库截图之后也不让它返回data了,而是将bitmap转化为file,将这个file复制给之前照相机的那个file,之后的方法就跟照相机截图的那个一样了。可能说的有点儿不清楚,直接上代码吧~~~~~~


File tempFile = new File(FileUtil.cachePath, "temp_avatar.jpg");


1,点击从相册中选择的时候

else if(v == photoLibBtn){

selectPic();

}

2.选择图片

private void selectPic(){

Intent intent = new Intent(Intent.ACTION_PICK, null);

        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");

        startActivityForResult(intent, SELECT_PIC_CODE);

}

3.处理返回的图片

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

//选择图库图片

if(resultCode == RESULT_OK && data != null && requestCode == SELECT_PIC_CODE){

startPhotoZoom(Uri.fromFile(copyfile(getImageBitmap(data), tempFile)), 640,CUT_PIC_CODE);

}

4.调用系统截图方法

private void startPhotoZoom(Uri uri, int size,int CUT_CODE) {

        Intent intent = new Intent("com.android.camera.action.CROP");

        intent.setDataAndType(uri, "image/*");

        // crop为true是设置在开启的intent中设置显示的view可以剪裁

        intent.putExtra("crop", "true");

        intent.putExtra("outputFormat", "JPEG");

        

        // aspectX aspectY 是宽高的比例

        intent.putExtra("aspectX", 1);

        intent.putExtra("aspectY", 1);


        // outputX,outputY 是剪裁图片的宽高

        intent.putExtra("outputX", size);

        intent.putExtra("outputY", size);

        intent.putExtra("scale", true);

        

        intent.putExtra("noFaceDetection", true);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

        intent.putExtra("return-data", false);

        startActivityForResult(intent, CUT_PIC_CODE);

    }

5. startPhotoZoom的第一个参数

(1)先将bitmap转化为file

//通过data拿到bitmap再转化为file

public File getImageBitmap(Intent data){

Uri selectedImage = data.getData();

String[] filePathColumns = { MediaStore.Images.Media.DATA };

Cursor c = this.getContentResolver().query(selectedImage,

filePathColumns, null, null, null);

if(c == null){

Util.showShortToast(this, R.string.person_info_base_pic);

return null;

}

c.moveToFirst();

int columnIndex = c.getColumnIndex(filePathColumns[0]);

String picturePath = c.getString(columnIndex);

File file = new File(picturePath);

return file;

}

(2)

//将一个file复制给另一个file

public static File copyfile(File fromFile, File toFile) {

if (!fromFile.exists()) {

return null;

}

if (!fromFile.isFile()) {

return null;

}

if (!fromFile.canRead()) {

return null;

}

if (!toFile.getParentFile().exists()) {

toFile.getParentFile().mkdirs();

}

try {

java.io.FileInputStream fosfrom = new java.io.FileInputStream(fromFile);

java.io.FileOutputStream fosto = new FileOutputStream(toFile);

byte bt[] = new byte[1024];

int c;

while ((c = fosfrom.read(bt)) > 0) {

fosto.write(bt, 0, c); // 将内容写到新文件当中

}

fosfrom.close();

fosto.close();

} catch (Exception ex) {

Log.e("readfile", ex.getMessage());

}return toFile;

}



1.点击照相机


selectPic();

else if(v == cameraBtn){

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(tempFile));

            startActivityForResult(intent, CAMERA_PIC_CODE);

}




Delphi是一种支持多平台开发的集成开发环境(IDE),可以开发多种操作系统和设备的应用程序。而Android是一种开放平台的操作系统,用于移动设备。 在Delphi中,可以使用FireMonkey框架来开发Android应用程序,并通过调用Android相机摄像头来拍照。 首先,需要在Delphi中创建一个新的FireMonkey移动应用程序项目。然后,通过添加一个按钮和一个图片控件来实现拍照功能。在按钮的Click事件中,编写代码来调用照相机摄像头。 在代码中,可以使用TAndroidCameraComponent组件来访问Android设备的摄像头功能。需要使用TBitmap类型的变量来存储拍摄的照片。 以下是示例代码: uses FMX.MediaLibrary, FMX.Types, FMX.Media; procedure TForm1.Button1Click(Sender: TObject); var Camera: TCameraComponent; begin Camera := TCameraComponent.Create(Self); Camera.Kind := TCameraKind.BackCamera; // 设置使用后置摄像头 Camera.Active := True; Camera.TakePhoto; // 调用拍照功能 // 在照片拍摄完成后,将其保存到TBitmap变量 while Camera.WaitingForPermission do Application.ProcessMessages; if Camera.HasPermission then begin CameraSample.BeginUpdate; try if Camera.SampleBufferToBitmap(Camera.SampleBuffer, CameraSample.Bitmap) then begin CameraSample.Bitmap.SaveToFile('path/to/save/image.jpg'); // 将照片显示到图片控件上 Image1.Bitmap.Assign(CameraSample.Bitmap); end; finally CameraSample.EndUpdate; end; end; Camera.Active := False; Camera.DisposeOf; end; 通过以上代码,可以在Delphi中调用Android照相机摄像头,并将拍摄的照片保存到指定路径,并显示在图片控件上。当然,你可以根据需求自行修改代码,添加图片预览、处理等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值