Android ImageView按路径显示图片

时间:2017-07-15 16:07:51

标签: java android sqlite imageview

我正在创建一个在SQLite中存储图像路径的应用程序。然后我们打开新的Activity,它应该显示来自数据库的图像。数据库工作正常,我测试了如果我得到结果(路径)并且它工作(用toast测试,见下文),但我不能让它在ImageView中显示图像,它总是空白。以下是我的一些代码:

XML文件:

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

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

</LinearLayout>

这是显示布局的活动类:

public class SimpleViewExample extends AppCompatActivity {

DBAdapter db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pogled);

    db = new DBAdapter(SimpleViewExample.this);

    db.openDB();

    Cursor c = db.getOneImage(1);
    c.moveToFirst();

    Toast.makeText(getApplicationContext(), c.getString(2), Toast.LENGTH_LONG).show();

    ImageView img = (ImageView) findViewById(R.id.slikatest);
    Bitmap bitmap = BitmapFactory.decodeFile(c.getString(2));

    img.setImageBitmap(bitmap);

   }
}

Toast返回的结果如:/storage/emulated/0/Pictures/Screenshots/example.png

欢迎任何帮助。谢谢它提前!

更新

看起来我有提问的问题,在logcat中发现此错误: open failed: EACCES (Permission denied)

知道如何解决这个问题吗?

FIX:

我很笨,抱歉。我只需要进入设置 - &gt;应用程序 - &gt;我的应用 - &gt;允许预先使用记忆。

抱歉,玩得开心

4 个答案:

答案 0 :(得分:1)

在android清单中包含权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

正如您所说的c.getString(2)返回图片路径。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pogled);

    db = new DBAdapter(SimpleViewExample.this);

    db.openDB();

    Cursor c = db.getOneImage(1);
    c.moveToFirst();

    Toast.makeText(getApplicationContext(), c.getString(2), Toast.LENGTH_LONG).show();


File imagefile = new  File(c.getString(2));

if(imagefile.exists()){

    Bitmap imageBitmap = BitmapFactory.decodeFile(imagefile.getAbsolutePath());

    ImageView img = (ImageView) findViewById(R.id.slikatest);

    img.setImageBitmap(imageBitmap);

}
}

答案 1 :(得分:0)

试试这个

img.setBackgroundResource(位图);

而不是

img.setImageBitmap(位图);

答案 2 :(得分:0)

只需在设置中提供预设 - &gt;应用程序 - &gt;然后选择我安装的应用程序 - &gt;预设 - &gt;允许使用记忆。

答案 3 :(得分:0)

如果您在Android 6.0+上进行测试,则必须进一步管理运行时权限,以便在Manifest中添加权限,如上所述。

Android runtime permissions guidance

下面是适用于我的代码(Android 7.0):

  1. 在db(在我的情况下使用ContentValues)中将路径存储为String后,我使用以下命令在自定义CursorAdapter类,bindView方法中重新执行:

    ImageView prodImageView = (ImageView) view.findViewById(R.id.prod_img);
    
    int picColumnIndex = cursor.getColumnIndex(InventoryContract.ProductEntry.COLUMN_PRODUCT_PIC);
    
    
    String prodPathPic = cursor.getString(picColumnIndex);
    
    File f = new File(prodPathPic);
    
    Bitmap imgBmp = BitmapFactory.decodeFile(f.getAbsolutePath());
    prodImageView.setImageBitmap(imgBmp);
    
    }
    
    1. 为了使其正常工作,我在主活动中的onCreate()方法中添加了以下代码,以询问用户对内部存储器的访问权限:
  2. int permissionCheck = ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
    
            } else {
    
                // No explanation needed, we can request the permission.
    
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        1);
    
                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }
    

    希望这会对你有所帮助