ImageView加载问题:在模拟器中工作,在真实设备中不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ImageView加载问题:在模拟器中工作,在真实设备中不起作用相关的知识,希望对你有一定的参考价值。

我在我的活动中展示了一个简单的ImageView

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.package.name.EditPicture">

    <ImageView
        android:id="@+id/problem_picture"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

</RelativeLayout>

在我的活动课中,这是我设置图像的方式:

//first calculate the width and height of the screen
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;

//Then, resize the image's width and height equal to that of the screen:
Picasso.with(this).load(new File(pictureLocation)).rotate(90f).resize(height,width).into(imageView);

问题是,我在模拟器中得到了理想的结果,但在我真正的Android手机中,没有显示任何内容。整个屏幕是空白的。

由于我已经将图像大小调整为屏幕大小,因此加载高分辨率图像时不应该出现任何问题。为什么我的屏幕在真实设备中是空白的?

答案

首先检查设备上可用的图像。

File file = new File(pictureLocation);
if (file.exists()) {
    Picasso.with(this).load(new File(pictureLocation)).into(imageView);
} else {
    Log.d("Result", "Image not available");
}
另一答案

我建议您在此方案中使用Content Provider。我有同样的问题,在视图中加载的图像是黑色的。存储访问框架是这里的解决方案

https://developer.android.com/guide/topics/providers/document-provider.html

另一答案

经过一番研究,这就是原因和解决方案:

屏幕在真实设备中显示为空白,因为ImageView无法加载大图像(相机为13MP,图像为3-4 MB)。我尝试了一个较小的图像(~100 KB),效果很好。令人遗憾的是毕加索和格莱德都无法做到这一点。

因此,我首先调整图像的大小,然后将它们压缩到100 KB范围内(如果您想要完整的高清图像,则需要采用不同的方法):

/**
 * getting the screen height and width, so that we could resize the image accordingly
 */
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;


/**
 * Getting the old photo and then resizing it to the size of the screen.
 * We are also compressing it. 70 is a number between 0 to 100.
 * You see, close to 0 means very low quality but very small in size image
 * Close to 100 means very high quality, but the size will be big.
 */
 Bitmap photo = BitmapFactory.decodeFile(pictureLocation);
 photo = Bitmap.createScaledBitmap(photo, width, height, false);
 ByteArrayOutputStream bytes = new ByteArrayOutputStream();
 photo.compress(Bitmap.CompressFormat.JPEG, 70, bytes);


 /**
  * fetching the location where this has to be saved. folder location is the location of my Pictures folder.
  */
  String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
  String smallFileLocation = folderLocation + File.separator + "IMG_" + timeStamp + ".jpg";

  /**
   * New file is saved at this place now.
   */
  File f = new File(smallFileLocation);
  f.createNewFile();
  FileOutputStream fo = new FileOutputStream(f);
  fo.write(bytes.toByteArray());
  fo.close();


  /**
   * Later, we can simply put the picture in our ImageView using Picasso or just imageView.setImageBitmap
   */
  Picasso.with(this).load(new File(smallFileLocation)).rotate(90f).resize(height,width).into(imageView);
另一答案

因为您的图像负载大(例如:4000px x 3000px)。使用毕加索:

int width = new DeviceSize(mContext).widthPixels();
Picasso.get().load(fileUploadPath)
                                    .resize(width, 0)
                                    .onlyScaleDown()
                                    .into(imageView);

--Class DeviceSize--

import android.content.Context;
import android.util.DisplayMetrics;

public class DeviceSize {

    private Context mContext;

    private int widthPixels;
    private int heightPixels;

    public DeviceSize(Context context) {
        mContext = context;
    }

    public int widthPixels() {
        DisplayMetrics lDisplayMetrics = mContext.getResources().getDisplayMetrics();
        widthPixels = lDisplayMetrics.widthPixels;
        return widthPixels;
    }

    public int heightPixels() {
        DisplayMetrics lDisplayMetrics = mContext.getResources().getDisplayMetrics();
        heightPixels = lDisplayMetrics.heightPixels;
        return heightPixels;
    }
}

以上是关于ImageView加载问题:在模拟器中工作,在真实设备中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

YouTube 视频评级 api (v3) 在模拟器中工作,但在真实设备中出现 403 错误

iOS - 无法在真实设备 iPhone 11 中运行 Flutter 应用程序。iOS - 15.2,Xcode 13.2.1,它在模拟器中工作

解析推送通知仅在模拟器中工作

为啥 MPMoviePlayerController 能在模拟器中工作,而不能在设备中工作?

我应该在 MPMoviePlayer 示例代码(适用于 iphone)中做出哪些区别才能使其在 Ipad 中工作?

Play商店预发布报告中的Android应用程序崩溃但在真实设备中工作