2011-12-09 24 views
18

Khi tôi gọi hàm này, không có hình ảnh nào trong chế độ xem hình ảnh bitmapFactory.decodefile(filename) hiển thị null .. vui lòng trợ giúp cho việc này.Bitmap trả về null từ BitmapFactory.decodeFile (tên tệp)

Đây là mã của tôi:

public Bitmap ShowImage(String imageName,String userImageName) 
{ 

    File sdcard_mainDirectory = new File(Environment.getExternalStorageDirectory(),"UserImages").getAbsoluteFile(); 

    File file = new File(sdcard_mainDirectory, userImageName).getAbsoluteFile(); 

    if (file != null) { 

     try { 

      String imageInSD = "/sdcard/UserImages/"+userImageName; 

      Bitmap bitmap = BitmapFactory.decodeFile(imageInSD); 

      return bitmap; 

     } 
     catch (Exception e) { 

      e.printStackTrace(); 
     } 

    } 

    return null; 

} 
+0

Đăng stackTrace. – st0le

Trả lời

26

Xin chào, đó là null vì kích thước hình ảnh lớn và ngoại lệ, vui lòng kiểm tra nhật ký của bạn và xem có lỗi bitmap outofmemory không nếu có, sau đó sử dụng tùy chọn cho:

BitmapFactory.Options options; 

try { 
    String imageInSD = "/sdcard/UserImages/" + userImageName; 
    Bitmap bitmap = BitmapFactory.decodeFile(imageInSD); 
    return bitmap; 
} catch (OutOfMemoryError e) { 
    try { 
    options = new BitmapFactory.Options(); 
    options.inSampleSize = 2; 
    Bitmap bitmap = BitmapFactory.decodeFile(imageInSD, null, options); 
    return bitmap; 
    } catch(Exception e) { 
    Log.e(e); 
    } 
} 
4

Rất đơn giản: tập tin của bạn, hoặc không phải là một hình ảnh hoặc hình ảnh không được hỗ trợ bởi thực hiện Bitmap của Android, hoặc bạn có con đường là không hợp lệ.


tài liệu Xem cho BitmapFactory.decodeFile(String file):

Returns
kết quả bitmap giải mã, hoặc null nếu nó không thể được giải mã.


Thông thường khi bitmap không thể được giải mã một số bản ghi được in để logcat. Kiểm tra chúng một cách cẩn thận.

+0

"Thông thường khi bitmap không thể giải mã một số nhật ký được in ra logcat. Hãy kiểm tra cẩn thận."câu quan trọng này là của tôi, cảm ơn :) – oguzhan

9

Tại sao bạn làm điều này Chuỗi imageInSD = "/ sdcard/UserImages /" + userImageName;

Tôi nghĩ Nếu bạn nhận được một file .png có mặt sau đó chỉ cần,

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 

LƯU Ý: Ngoài ra kiểm tra bạn có một Android hỗ trợ tập tin ảnh có mặt ở vị trí đó ..

+1

Khi tải hình ảnh được lưu trong bộ nhớ cache từ bộ nhớ ngoài, tệp.getAbsolutePath() đã sửa nó cho tôi, mặc dù getPath() là chính xác. – scottyab

7

Hãy thử thêm quyền truy cập thẻ SD READ_EXTERNAL_STORAGE và/hoặc WRITE_EXTERNAL_STORAGE. Nó phù hợp với tôi.

5

Hãy chắc chắn rằng trong các tùy chọn của bạn (BitmapFactory.Options) các InJustDecodeBounds được thiết lập để sai hoặc nếu không nó sẽ trả về null. Điều này có thể được đặt thành true khi bạn chỉ muốn tệp được giải mã nhưng bạn không cần thêm nữa trong mã của mình. Bằng cách này, không cần phân bổ thêm bộ nhớ. Xem here để được giải thích thêm.

0

tôi nhớ da diết kiểm tra sự cho phép thời gian chạy trên mức API lớn hơn 16.

1

Các BitmapFactory.decodeFile() thực hiện trước khi toàn bộ đặt hình ảnh trong con đường chính xác. Khi decodeFile() thực thi không có hình ảnh. Vì vậy, bitmap trả về null. Nói chung, hình ảnh pixel cao mất thêm thời gian để đặt trong đường dẫn của chúng. Vì vậy, ngoại lệ này xảy ra.

Vui lòng kiểm tra giá trị rỗng và thử decodeFile.

Bitmap bitmap = null; 

while(bitmap == null) 
    bitmap = BitmapFactory.decodeFile(imageInSD);