图像显示在模拟器上,但不在真实设备上

时间:2016-04-27 10:06:55

标签: java android image emulation device

我正在开发一个Android项目,我在其中使用自定义ListView,左侧是图像 我使用Genymotion模拟器,工作正常。图像完美显示: Screenshot from Genymotion emulator

然而,当我在我的设备上使用该应用程序(华为P8 Lite)时,没有显示任何内容:Screenshot from device

我尝试在我的设备上调试应用程序,图像路径存在(否则它们将是“无图像可用”)ans是: / storage / emulated / 0 / Pictures / JPEG_20160415_134349_- 350854394.jpg
我去了Android设备监视器,图像存在,但路径略有不同(mnt / shell /而不是/ storage /,但我不认为这是真正的问题,是吗?)
堆栈跟踪中没有任何“OutOfMemory”错误或任何其他错误 这是我用来显示图片的代码:

    if(values.get(position).getImgList().size()==0){
        imageView.setImageResource(R.drawable.nopics);
    }
    else {
    //getImg() return the path (string) of the first image in a ArrayList of path
        imageView.setImageBitmap(values.get(position).getImg());
    }

我很确定getImg()会返回一个图像,因为当我将图像发送到Web服务时,我使用相同的方法。网络服务正确接收图像 我的Android Manifest中也有读/写内部/外部存储。

编辑:我忘记了布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
<ImageView
    android:id="@+id/icon"
    android:layout_width="200px"
    android:layout_height="200px"
    android:layout_marginLeft="40px"
    android:layout_marginRight="10px"
    android:layout_marginTop="4px">
</ImageView>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
<TextView
    android:id="@+id/label"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="70px"
    android:layout_marginLeft="10px"
    android:text="@+id/label"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:textSize="48px" >
</TextView>

<ImageButton
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:id="@+id/croixrouge"
    android:src="@drawable/croixrouge"
    android:layout_alignBottom="@+id/label"
    android:layout_marginBottom="50px"
    android:layout_alignEnd="@+id/label" />

    <ImageButton
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:id="@+id/option"
        android:src="@drawable/modif"
        android:layout_alignTop="@+id/croixrouge"
        android:layout_toStartOf="@+id/croixrouge"
        android:layout_marginRight="5px"/>

    <ImageButton
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:id="@+id/refresh"
        android:src="@drawable/refreshpurple"
        android:layout_alignTop="@+id/option"
        android:layout_toStartOf="@+id/option"
        android:layout_marginRight="5px" />
</RelativeLayout>
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10px"
    android:id="@+id/sublabel"
    android:text="@+id/sublabel"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:textSize="32px"/>

</LinearLayout>

</LinearLayout>  

getImg()代码:

public Bitmap getImg() {
    if(imgList.size() !=0) {
        Bitmap bmp = BitmapFactory.decodeFile(imgList.get(0));
        return bmp;
    }
    return null;
}

编辑:我如何选择图片:         protected void onActivityResult(int requestCode,int resultCode,                                     Intent imageData){         super.onActivityResult(requestCode,resultCode,imageData);

    switch (requestCode) {
        case Define.ALBUM_REQUEST_CODE:
            if (resultCode == RESULT_OK) {
                path = imageData.getStringArrayListExtra(Define.INTENT_PATH);
...
            }
    }
}  

后来:

 r.setImgList(path);  

有人可以帮我理解为什么图像不会显示在真实设备上吗?

3 个答案:

答案 0 :(得分:0)

当您尝试在ImageView上加载具有更高分辨率的图像时会发生这种情况。您必须将其缩小为多种尺寸(ldpi,mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi)以支持多种屏幕分辨率和尺寸。

请参阅此link

答案 1 :(得分:0)

您可以使用此辅助方法获取图像的真实路径。在getImg()方法中,传递从辅助方法创建的路径:

public Bitmap getImg() {
    if(imgList.size() != 0) {
        Uri uri = Uri.parse(imgList.get(0));
        String path = getRealPathFromUri(getActivity(), uri)
        Bitmap bmp = BitmapFactory.decodeFile(path);
        return bmp;
    }
    return null;
}

public String getRealPathFromURI(Context context, Uri uri) {
    String path;
    if ("content".equals(uri.getScheme())) {
        path = getRealPathFromContentURI(context, uri);
    } else if ("file".equals(uri.getScheme())) {
        path = uri.getPath();
    } else {
        path = uri.toString();
    }
    return path;
}

private String getRealPathFromContentURI(Context context, Uri contentUri) {
    if (contentUri == null) {
        return null;
    }

    String[] proj = { MediaStore.Images.Media.DATA };
    CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();

    if (cursor == null) {
        return null;
    }

    int column_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
    if (column_index == -1) {
        cursor.close();
        return null;
    }

    String path;
    if (cursor.moveToFirst()) {
        path = cursor.getString(column_index);
    } else {
        path = null;
    }

    cursor.close();
    return path;
}

答案 2 :(得分:0)

解决了问题!
我缩放了位图。看起来它不适合屏幕或其他东西......

public Bitmap getImg() {
    if(imgList.size() !=0) {
        Bitmap bmp = BitmapFactory.decodeFile(imgList.get(0));
        int nh = (int) ( bmp.getHeight() * (800.0 / bmp.getWidth()) );
        Bitmap scaled = Bitmap.createScaledBitmap(bmp, 600, nh, true);
        return scaled;
    }
    return null;
} 

感谢您的帮助