繁体   English   中英

Android中的相机意图问题

[英]Camera Intent issue in Android

我使用相机意图让用户捕获照片并将其发送到另一个活动以供进一步使用。 我在相机意图的putExtra方法中包括EXTRA_OUTPUT部分,以便可以获取完整尺寸的图像而不是缩略图。 问题是,捕获图像后,我被重定向到MainActivity 在“ 文件管理器”中看到时,我发现该图像已保存。 请帮忙。

 CameraButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                String imageFileName = timeStamp + ".jpg";
                File storageDir = Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES);
                pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;
                file = new File(pictureImagePath);
                outputFileUri = Uri.fromFile(file);
                Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                camera.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
                startActivityForResult(camera, REQUEST_IMAGE_CAPTURE);
            }
        });


@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK && null != data) {
try {

                    b = MediaStore.Images.Media.getBitmap(this.getContentResolver(), outputFileUri);
                    String filename123 = "myphoto.jpg";
                    FileOutputStream out = this.openFileOutput(filename123, Context.MODE_PRIVATE);
                    b.compress(Bitmap.CompressFormat.JPEG, 100, out);
                    out.close();
                    b.recycle();
                    Intent in1 = new Intent(this, ongallery.class);
                    in1.putExtra("picture", filename123);
                    startActivity(in1);
                }catch(Exception e)
                {
                    Toast.makeText(this,"You got Error!",Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            Toast.makeText(this,"Something went wrong",Toast.LENGTH_SHORT).show();
        }
    }


//OnaGallery.java
public class ongallery extends Activity {
    public  ImageView imgView;
    int xDim;
    int yDim;
String filename;
    public  Bitmap finale = null ;
    public  Bitmap bmp = null;
    public Bitmap photoEdit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ongallery);
        imgView = (ImageView) findViewById(R.id.imgView);
        xDim = imgView.getWidth();
        filename = getIntent().getStringExtra("picture");
        try {
            FileInputStream is = this.openFileInput(filename);
            bmp = BitmapFactory.decodeStream(is);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Bitmap finalPhoto = decoder(filename,400,400);
            imgView.setImageBitmap(finalPhoto);
            }
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
    }
  public Bitmap decoder(String filename, int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
      String filepath = getFileStreamPath(filename).getPath();
        BitmapFactory.decodeFile(filepath, options);
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        finale = BitmapFactory.decodeFile(filepath, options);
        return finale;
    }
     int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) {
        int inSampleSize = 1;
        if (options.outHeight > reqHeight || options.outWidth > reqWidth) {
            final int halfHeight = options.outHeight / 2;
            final int halfWidth = options.outWidth / 2;
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }
}

许可摄像机许可检查类

public class Utility {
public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static boolean checkPermission(final Context context)
{
    int currentAPIVersion = Build.VERSION.SDK_INT;
    if(currentAPIVersion>=android.os.Build.VERSION_CODES.N)
    {
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                AlertDialog.Builder alertBuilder = new 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);
                    }
                });
                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;
    }
}

}

现在,请先检查权限,然后再启动相机意图

 boolean permissionCheck = Utility.checkPermission(getActivity());
  if (permissionCheck) {
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      startActivityForResult(intent, CAMERA_REQUEST);
    }

现在在onActivityResult()中看起来像

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
         if (requestCode == CAMERA_REQUEST)
            bitmap = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");

    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, false);
    // Toast.makeText(SignUpActivity.this, String.valueOf(destination), Toast.LENGTH_LONG).show();
    imageView.setImageBitmap(bitmap);
    } else if (resultCode == RESULT_CANCELED) {
        Toast.makeText(getActivity(), "Cancelled",
                Toast.LENGTH_SHORT).show();
    }

}

AndroidMenifest.xml中的权限

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

希望这会帮助你。

如果您是在android> = 6上运行代码,则需要在设备运行之前和安装之后从您的设备授予其权限 你做完了吗? 这可以从应用程序信息/设置菜单中完成。

设置->应用程序->(选择您的应用程序)->权限->(启用所有权限)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM