Java 如何在android中选择和裁剪图像?

Java 如何在android中选择和裁剪图像?,java,android,image,android-intent,crop,Java,Android,Image,Android Intent,Crop,嘿,我目前正在制作一张实时墙纸,我允许用户选择一张在我的效果后面的图像 目前我有: Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); i.putExtra("crop", "true"); startActivityForResult(i, 1); 略低于此: @Override

嘿,我目前正在制作一张实时墙纸,我允许用户选择一张在我的效果后面的图像

目前我有:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            i.putExtra("crop", "true");
            startActivityForResult(i, 1);
略低于此:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == 1)
        if (resultCode == Activity.RESULT_OK) {
          Uri selectedImage = data.getData();
          Log.d("IMAGE SEL", "" + selectedImage);
          // TODO Do something with the select image URI
          SharedPreferences customSharedPreference = getSharedPreferences("imagePref", Activity.MODE_PRIVATE);
          SharedPreferences.Editor editor = customSharedPreference.edit();
          Log.d("HO", "" + selectedImage);
          editor.putString("imagePref", getRealPathFromURI(selectedImage));
          Log.d("IMAGE SEL", getRealPathFromURI(selectedImage));
          editor.commit();
        } 
    }
当我的代码运行时,Logcat告诉我selectedImage为null。如果我把这个评论删掉

i.putExtra("crop", "true"):

Logcat没有给我空指针异常,我可以对图像执行我想要的操作。那么,这里的问题是什么?有人知道我该怎么解决这个问题吗?谢谢您的时间。

我也遇到了这个问题。您可以尝试使用此代码。这对我来说很好

private static final String TEMP_PHOTO_FILE = "temporary_holder.jpg";  

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
photoPickerIntent.putExtra("crop", "true");
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE);

private Uri getTempUri() {
    return Uri.fromFile(getTempFile());
}

private File getTempFile() {

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

        File file = new File(Environment.getExternalStorageDirectory(),TEMP_PHOTO_FILE);
        try {
            file.createNewFile();
        } catch (IOException e) {}

        return file;
    } else {

        return null;
    }
}

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

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    switch (requestCode) {
        case REQ_CODE_PICK_IMAGE:
            if (resultCode == RESULT_OK) {  
                if (imageReturnedIntent!=null) {

                    File tempFile = getTempFile();

                    String filePath= Environment.getExternalStorageDirectory()
                        +"/"+TEMP_PHOTO_FILE;
                    System.out.println("path "+filePath);


                    Bitmap selectedImage =  BitmapFactory.decodeFile(filePath);
                    _image = (ImageView) findViewById(R.id.image);
                    _image.setImageBitmap(selectedImage );

                    if (tempFile.exists()) tempFile.delete();
                }
            }
    }       
}

您不需要临时文件:

protected static final int REQ_CODE_PICK_IMAGE = 1;



Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    photoPickerIntent.setType("image/*");
    photoPickerIntent.putExtra("crop", "true");
    photoPickerIntent.putExtra("return-data", true);
    photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE);


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

        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

        switch (requestCode) {
            case REQ_CODE_PICK_IMAGE:
                if (resultCode == RESULT_OK) {  
                    if (imageReturnedIntent!=null) {
                        Bundle extras = imageReturnedIntent.getExtras();
                        Bitmap selectedBitmap = extras.getParcelable("data");
                        imageR = (ImageView) findViewById(R.id.image);
                        imageR.setImageBitmap(selectedBitmap);
                    }
                }
        }       
}
这段代码很适合“初学者”^^

=======================

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);


    switch (requestCode) {
    case REQ_CODE_PICK_IMAGE:
        if (resultCode == RESULT_OK) {  
          if (imageReturnedIntent!=null){



          //     File tempFile = getTempFile();

              ImagePath_1 = Environment.getExternalStorageDirectory()
            + "/temporary_holder.jpg";
              System.out.println("path "+ImagePath_1);


              FixBitmap =  BitmapFactory.decodeFile(ImagePath_1);
              ShowSelectedImage = (ImageView)findViewById(R.id.imageView);
              ShowSelectedImage.setImageBitmap(FixBitmap);



          }
        }
    }
}
@Override
        protected String doInBackground(Void... params) {


            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 1;
            //options.outWidth = 50;
            //options.outHeight = 50;
            FixBitmap = BitmapFactory.decodeFile(ImagePath_1, options);
            //FixBitmap = BitmapFactory.decodeResource(getResources(), R.id.imageView);

           byteArrayOutputStream = new ByteArrayOutputStream();
           FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); //compress to 50% of original image quality
           byteArray = byteArrayOutputStream.toByteArray();

           ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
===============================

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);


    switch (requestCode) {
    case REQ_CODE_PICK_IMAGE:
        if (resultCode == RESULT_OK) {  
          if (imageReturnedIntent!=null){



          //     File tempFile = getTempFile();

              ImagePath_1 = Environment.getExternalStorageDirectory()
            + "/temporary_holder.jpg";
              System.out.println("path "+ImagePath_1);


              FixBitmap =  BitmapFactory.decodeFile(ImagePath_1);
              ShowSelectedImage = (ImageView)findViewById(R.id.imageView);
              ShowSelectedImage.setImageBitmap(FixBitmap);



          }
        }
    }
}
@Override
        protected String doInBackground(Void... params) {


            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 1;
            //options.outWidth = 50;
            //options.outHeight = 50;
            FixBitmap = BitmapFactory.decodeFile(ImagePath_1, options);
            //FixBitmap = BitmapFactory.decodeResource(getResources(), R.id.imageView);

           byteArrayOutputStream = new ByteArrayOutputStream();
           FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); //compress to 50% of original image quality
           byteArray = byteArrayOutputStream.toByteArray();

           ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);

我有同样的问题,这个线程有帮助,另一个类似的线程:记住如果你想删除文件,你可能需要将这个权限添加到你的清单中:
@Haraldo。我没有在安卓4.1中检查它。我会检查一下update@jennifer那么对于相机拍摄,我们也要做些什么呢?Intent getCameraImage=newintent(“android.media.action.IMAGE_-Capture”);我可以用你的代码找到路径…但我不能显示你救了我一天!在4.3--工作得很好。在4.4+上可以使用常见的变量:imageStream=getContentResolver().openInputStream(imageuri);位图bmap=BitmapFactory.decodeStream(imageStream);当选择Google Photos App以选择图像时,此功能不起作用。从Google Photos App选择照片时出现空指针异常。选择、裁剪并单击“确定/检查”图标后不会发生任何情况。它卡在作物屏幕上。有什么想法吗?