Helpex - Trao đổi & giúp đỡ Đăng nhập
38

Khi tôi đang gọi chức năng này, không có hình ảnh nào trong chế độ xem hình ảnh bitmapFactory.decodefile(filename)hiển thị rỗng .. xin vui lòng giúp đỡ cho điều này.

Đâ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;

}
38 hữu ích 1 bình luận 70k xem chia sẻ
14 trả lời 14
41

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

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 excepetion) {
    Log.e(excepetion);
  }
}
41 hữu ích 1 bình luận chia sẻ
11

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 tệp .png thì chỉ cần,

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

LƯU Ý: Ngoài ra, hãy kiểm tra xem bạn có tệp hình ảnh được hỗ trợ Android ở vị trí đó không ..

11 hữu ích 1 bình luận chia sẻ
11

Đảm bảo rằng trong các tùy chọn của bạn (BitmapFactory.Options), InJustDecodeBounds được đặt thành false 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ó trong mã của mình. Bằng cách này, không cần cấp phát thêm bộ nhớ. Xem ở đây để giải thích thêm.

11 hữu ích 0 bình luận chia sẻ
10

Thật đơn giản: tệp của bạn không phải là hình ảnh hoặc hình ảnh không được triển khai Bitmap của Android hỗ trợ hoặc đường dẫn của bạn không hợp lệ.


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

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


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

10 hữu ích 1 bình luận chia sẻ
9

Cố gắng thêm quyền truy cập thẻ SD READ_EXTERNAL_STORAGE và / hoặc WRITE_EXTERNAL_STORAGE. Nó làm việc cho tôi.

9 hữu ích 0 bình luận chia sẻ
4

Tôi đã thiếu kiểm tra quyền thời gian chạy ở cấp API lớn hơn 22. Khởi động Marshmellow

4 hữu ích 0 bình luận chia sẻ
4

nếu bạn đang cố gắng trong android 10, hãy thử thêm ứng dụng này vào ứng dụng của bạn trong tệp kê khai, android:requestLegacyExternalStorage="true"đó có thể là vấn đề về quyền với android 10 vì nó không cho phép truy cập trực tiếp vào tệp

4 hữu ích 0 bình luận chia sẻ
3

Giải pháp của tôi là thêm vào thẻ Ứng dụng của tệp kê khai:

Android: requestLegacyExternalStorage = "true"
3 hữu ích 0 bình luận chia sẻ
2

Việc BitmapFactory.decodeFile()thực thi trước khi đặt toàn bộ hình ảnh vào đường dẫn 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, các hình ảnh pixel cao mất thêm thời gian để đặt trong đường dẫn của chúng. Vì vậy, trường hợp ngoại lệ này xảy ra.

Vui lòng kiểm tra null và thử decodeFile.

Bitmap bitmap = null;

while(bitmap == null)
   bitmap = BitmapFactory.decodeFile(imageInSD);
2 hữu ích 1 bình luận chia sẻ
1

Tôi đang xây dựng một ứng dụng xử lý hình ảnh và cũng đã trả về null khi thử các phương pháp này. Bảng điều khiển của tôi trả về không phải là một lỗi mà là một câu lệnh degub như thế này

D / skia: --- decoder-> decode trả về false

Đây là những gì tôi tìm thấy sẽ tải bất kỳ bitmap nào trong ứng dụng của tôi

1) tên tệp chính xác với các quyền thích hợp

2) Thu nhỏ hình ảnh khi thích hợp

3) Nếu bạn cần một hình ảnh lớn, hãy đặt nó bên dưới bạn biểu hiện như vậy

 <application

    android:largeHeap="true"

</application>

Sử dụng một heap lớn không thể thay thế cho việc hiển thị kích thước hình ảnh chính xác. Đây là ví dụ về mã tôi sử dụng trực tiếp từ tài liệu android

 public Bitmap getRawImageThumb(Context mContext)
{
    Bitmap b = null;

    int reqHeight = 100, reqWidth = 100;

    String filename = mContext.getFilesDir().toString() + "/" + rawFileName;
    Log.d(TAG, "processRawReceipt: " + rawFileName);


    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    //options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    BitmapFactory.decodeFile(filename, options);
    int height = options.outHeight;
    int width = options.outWidth;


    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    options.inSampleSize = inSampleSize;
    options.inJustDecodeBounds = false;
    Log.d(TAG, "getRawImage: " + String.valueOf(height) + " "  + String.valueOf(width) + " " + String.valueOf(inSampleSize));
    b = BitmapFactory.decodeFile(filename, options);

    return b;
}
1 hữu ích 1 bình luận chia sẻ
0
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

Điều này trả về null, nếu

  1. Đường dẫn tệp đến hình ảnh bị sai
  2. Khi android không thể giải mã ảnh bitmap, vì vậy hãy kiểm tra xem bạn có thể xem ảnh trong phần mềm xem ảnh khác hay không.

nếu hai điểm trên là ổn trong mã của bạn, điều đó có nghĩa là bạn đang nhận được giá trị null vì đã mất thời gian để android hiển thị hình ảnh.

thêm một trình xem hình ảnh giả vào mã của bạn để tăng tốc quá trình kết xuất.

bm = BitmapFactory.decodeFile (dir.getAbsolutePath ());

imgPassport.setImageBitmap (bm); // Trình xem hình ảnh này không hiển thị trong Ứng dụng của tôi

Đồng thời đảm bảo rằng bạn không gọi phương thức decodeFile (dir.getAbsolutePath ()) từ luồng nền

0 hữu ích 0 bình luận chia sẻ
0

Giải thích rõ ràng được đưa ra trong tài liệu google https://developer.android.com/topic/performance/graphics/load-bitmap#java

Setting the inJustDecodeBounds property to true while decoding avoids memory allocation, returning null cho đối tượng bitmap.

theo tùy chọn@Jeroen VL thay đổi.inJustDecodeBounds = false đã giải quyết được vấn đề

0 hữu ích 0 bình luận chia sẻ
0

Xóa "options.inJustDecodeBounds = true;"nếu bạn có

  val options =  BitmapFactory.Options();
  //options.inJustDecodeBounds = true; //delete this line
  var bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
0 hữu ích 0 bình luận chia sẻ
-1

Hãy thử mã này, nó sẽ giúp bạn giải quyết vấn đề của mình

Thay thế hình ảnh thư viện bằng hình ảnh thư viện trong chương trình android ngoại lệ quá lớn

-1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ android , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading