2010-01-18 43 views
27

Hey, tôi hiện đang làm việc trên một hình nền sống và tôi cho phép người dùng chọn một hình ảnh mà sẽ đi phía sau hiệu ứng của tôi.Cách chọn và cắt hình ảnh trong android?

Hiện nay tôi có:

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

Và hơi dưới rằng:

@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(); 
     } 
    } 

Khi mã của tôi là ran, Logcat nói với tôi rằng selectedImage là null. Nếu tôi nhận xét số điện thoại

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

Logcat không cung cấp cho tôi ngoại lệ con trỏ null và tôi có thể làm những gì tôi muốn với hình ảnh. Vậy vấn đề ở đây là gì? Có ai có bất kỳ ý tưởng làm thế nào tôi có thể sửa lỗi này? Cảm ơn vì đã dành thời gian cho tôi.

+0

Tôi có cùng một câu hỏi, và chủ đề này sẽ giúp, http://stackoverflow.com/questions/8238460/android-2-1-crop-image-fail – user538565

+0

một thread tương tự: http: //stackoverflow.com/questions/12758425/how-to-set-the-output-image-use-com-android-camera-action-crop/ – hcpl

Trả lời

45

Tôi cũng đã gặp sự cố này. Bạn có thể thử với mã này. Nó làm việc tốt cho tôi

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(); 
       } 
      } 
    }  
} 
+0

xin chào jennifer! bạn đã thử nghiệm điều này trong 4.1 chưa. ??? –

+2

Chỉ cần nhớ nếu bạn muốn xóa các tệp, bạn có thể cần thêm quyền này vào tệp kê khai của mình: '' – HGPB

+0

@Haraldo. Tôi đã không kiểm tra nó trong Android 4.1. Tôi sẽ kiểm tra và cập nhật – jennifer

6

Bạn không cần một file Temp:

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); 
        } 
       } 
     }  
} 
+1

Bạn đã lưu ngày của tôi! Ngày 4.3- - làm việc tốt. trên 4.4+ có thể sử dụng biến thể thông thường: imageStream = getContentResolver(). openInputStream (imageuri); Bitmap bmap = BitmapFactory.decodeStream (imageStream); – kaftanati

+0

Tính năng này không hoạt động khi ứng dụng Google Photos được chọn để chọn hình ảnh – Gaurav

0

này mã tốt với "người mới bắt đầu" ^^

private Bitmap FixBitmap; 
Bitmap thePicBitmap; 
String ImagePath = "image_path"; 
String ImagePath_1; 
private static final String TEMP_PHOTO_FILE = "temporary_holder.jpg"; 
private static final int REQ_CODE_PICK_IMAGE = 0; 




@Override 
     public void onClick(View view) { 
      try { 




      //intent = new Intent(); 
      // intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      //intent.setAction(Intent.ACTION_GET_CONTENT); 
      photoPickerIntent.setType("image/*"); 
      photoPickerIntent.putExtra("crop", "true"); 
      photoPickerIntent.putExtra("scale", true); 
      photoPickerIntent.putExtra("aspectX", 1); 
      photoPickerIntent.putExtra("aspectY", 1); 
      // indicate output X and Y 
      photoPickerIntent.putExtra("outputX", 150); 
      photoPickerIntent.putExtra("outputY", 100); 


      photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 
      photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
      startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 




      } catch (Exception e) { 
       // Toast.makeText(getApplicationContext(), R.string.imageException, Toast.LENGTH_LONG).show(); 
       Log.e(e.getClass().getName(), e.getMessage(), e); 
       Toast toast = Toast.makeText(Upload_image_text.this, "This device doesn't support the crop action!", 
         Toast.LENGTH_SHORT); 
       toast.show(); 
      } 




     } 

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

     private File getTempFile() { 
      if (isSDCARDMounted()) { 

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

      } 
      return f; 
      } else { 
      return null; 
      } 
      } 

     private boolean isSDCARDMounted(){ 
      String status = Environment.getExternalStorageState(); 
      if (status.equals(Environment.MEDIA_MOUNTED)) 
      return true; 
      return false; 
      } 
    }); 

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

@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); 
Các vấn đề liên quan