我正在创建一个在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;允许预先使用记忆。
抱歉,玩得开心
答案 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):
在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);
}
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.
}
}
希望这会对你有所帮助