2012-04-23 49 views
14

Tôi bắt đầu một yêu cầu cho một lựa chọn hình ảnh:Android - Hình ảnh Picker, Hình ảnh sai

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Choose"), PHOTO_GALLERY); 

Và nhận được dữ liệu trở lại trong onActivityResult:

if(resultCode == Activity.RESULT_OK && requestCode == PHOTO_GALLERY) 
{ 
    U.log(data.getData()); 
    Bitmap bm = ... // built from the getData() Uri 
    this.postImagePreview.setImageBitmap(bm); 
} 

Khi tôi khởi động tiếp cận mục đích, tôi xem một số thư mục, chẳng hạn như sdcard, Drop Box, MyCameraApp, v.v.

Nếu tôi chọn ảnh từ sdcard, khi tôi tải bản xem trước, đó là hình ảnh hoàn toàn sai. Các thư mục khác dường như không cho tôi vấn đề này.

Có ai biết lý do tại sao nó cho phép tôi chọn một hình ảnh, sau đó cho tôi Uri cho người khác không?

EDIT: Dưới đây là một số exampled đăng nhập getData() s:

Tốt:

content://com.google.android.gallery3d.provider/picasa/item/5668377679792530210

Xấu:

content://media/external/images/media/28

EDIT: Tôi sti sẽ gặp sự cố khi chọn từ thư mục sdcard của thư viện.

Dưới đây là mở rộng thêm một chút về những gì tôi đang làm trong onActivityResult:

// cursor 
Uri selectedImage = data.getData(); 

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

Cursor cursor = mContext.getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
cursor.moveToFirst(); 

int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
String filePath = cursor.getString(columnIndex); 
cursor.close(); 

// Cursor: /mnt/sdcard/Pic.jpg : /mnt/sdcard/Pic.jpg 
U.log("Cursor: " + filePath + " : " + Uri.parse(filePath)); 

// "regular" 

// Regular: content://media/external/images/media/28 : content://media/external/images/media/28 
U.log("Regular: " + data.getDataString() + " : " + Uri.parse(data.getDataString())); 

// Regular 2: content://media/external/images/media/28 : content://media/external/images/media/28 
U.log("Regular 2: " + data.getData() + " : " + data.getData()); 


mPostImagePreview.setImageBitmap(BitmapFactory.decodeFile(filePath)); 
mPostImagePreview.setVisibility(View.VISIBLE); 

Họ vẫn thiết lập các hình ảnh sai. Nếu tôi đi vào Gallery, dài bấm hình ảnh, và xem chi tiết tôi nhận được:

TItle: Pic 
Time: May 2, 2012 
Width: 720 
Height: 1280 
Orientation: 0 
File size: 757KB 
Maker: Abso Camera 
Model: Inspire 4G 
Path: /mnt/sdcard/Pic.jpg 

Vì vậy, Thư viện là nói cho tôi con đường là giống như các hành động lựa chọn, và Bộ sưu tập được làm cho nó một cách chính xác . Vậy tại sao trên trái đất là nó không hiển thị nếu tôi đặt nó từ onActivityResult?

Ngoài ra, đây là mã tôi đang sử dụng để bắn tiếp cận mục đích bây giờ:

private void selectPhoto() 
{ 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    ((Activity)mContext).startActivityForResult(Intent.createChooser(intent, "Select Picture"), PHOTO_GALLERY); 
} 
+0

Hành vi này có phải là ngẫu nhiên không? Ý tôi là, có bất kỳ mẫu nào bạn nhìn thấy khi bạn lặp lại lựa chọn hình ảnh không ..? – Ronnie

+2

có thể hình thu nhỏ trong thư viện bị sai. điều này có thể xảy ra nếu ví dụ như hình ảnh bị xóa vì Android sử dụng lại id hình ảnh. – uwe

+0

@ userSeven7s: Luôn khi tôi Chọn từ thư mục sdcard của ứng dụng Thư viện. – Josh

Trả lời

4

Đôi khi hình thu nhỏ trong ứng dụng thư viện có thể lỗi thời và hiển thị hình thu nhỏ cho một hình ảnh khác. Điều này có thể xảy ra khi các id hình ảnh được sử dụng lại, ví dụ như khi một hình ảnh bị xóa và một hình ảnh mới được thêm vào bằng cách sử dụng cùng một id.

Quản lý ứng dụng> Thư viện> Xóa dữ liệu có thể khắc phục sự cố này sau đó.

+0

Cảm ơn bạn lần nữa! Thật không may có vẻ như hệ thống tự động gán tiền thưởng khi hết thời gian vào ngày khác, nhưng tôi đã đánh dấu bạn là câu trả lời đúng :) – Josh

5

Đây là mã để mở thư viện. Tuy nhiên, điều này cũng giống như những gì bạn đã làm. Ngoài ra, hãy xem mã onActivityResult mà tôi đã sử dụng để truy xuất lại hình ảnh đã chọn.

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Select Picture"), 
         PHOTO_GALLERY); 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
switch (requestCode) { 
    case PHOTO_GALLERY: 
     if (resultCode == RESULT_OK) { 
      Uri selectedImageUri = Uri.parse(data.getDataString()); 
      try { 
       Bitmap bitmap = MediaStore.Images.Media.getBitmap( 
            getApplicationContext().getContentResolver(), 
            selectedImageUri); 

       this.postImagePreview.setImageBitmap(bitmap); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      break; 
     } 
    } 
} 
+0

Xem chỉnh sửa của tôi, điều này vẫn không hoạt động. – Josh

3

private static int RESULT_LOAD_IMAGE = 1;

Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(i, RESULT_LOAD_IMAGE); 

OnActivity quả

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
       Uri selectedImage = data.getData(); 
       String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
       Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
       cursor.moveToFirst(); 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String picturePath = cursor.getString(columnIndex); 
       cursor.close(); 
       ImageView imageView = (ImageView) findViewById(R.id.imgView); 
       imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
      } 
     } 
+0

Khác với ý định hơi khác nhau, đó là nghĩa đen chính xác những gì tôi có ngay bây giờ, như đã lưu ý trong bài chỉnh sửa trước đó của tôi. Tôi đã cố gắng Intent lửa của bạn, và nó vẫn mang lại kết quả tương tự. – Josh

+0

+1 cho câu trả lời của bạn bummbat – dhams

3

thử này một

//Put this code on some event 

    Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

startActivityForResult(intent, REQUEST_CODE); 

      // When above event fire then its comes to this 
     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
       if (resultCode==RESULT_OK && requestCode==1){ 

        Uri selectedImage = data.getData(); 
        String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

        Cursor cursor = getContentResolver().query(selectedImage, 
          filePathColumn, null, null, null); 
        cursor.moveToFirst(); 
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
        filePath = cursor.getString(columnIndex); 
        cursor.close(); 

          // Use it as per recruitment 
        actualBitmap =BitmapFactory.decodeFile(filePath); 

       } 
    } 
0

Hãy thử điều này,

public class SelectPhotoActivity extends Activity { 

private static final int SELECT_PICTURE = 1; 
private String selectedImagePath=""; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivityForResult(intent, SELECT_PICTURE); 
} 

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode == RESULT_OK) { 
     if (requestCode == SELECT_PICTURE) 
     { 
      Uri selectedImageUri = data.getData(); 
      selectedImagePath = getPath(selectedImageUri); 
      // here you can set the image 
      } 
    } 
} 

} 
Các vấn đề liên quan