Мне очень трудно понять, как загрузить изображение, когда у меня есть его URI.
Приложение работает следующим образом:
Я проверяю в базе данных SQLite, существует ли пользователь, и затем запускаю DescriptionActivity (код ниже). Если пользователь уже был добавлен в базу данных, я хочу получить описание из базы данных и загрузить его в EditText (descFromDb [0] - здесь нет проблем) и получить URI из базы данных для загрузки изображения в компонент ImageView (descFromDb) [1] - здесь много проблем), журналы из Logcat вставляются ниже кода класса. Также есть код для случая, когда пользователь хочет загрузить картинку из галереи, и кнопка, которая обновляет описание и URI изображения в базе данных.
Я уже добавил разрешения WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE и MANAGE_DOCUMENTS в мой файл манифеста, однако это по-прежнему не позволяет мне загружать изображение на основе его URI.
Я прочитал некоторые темы, в которых рекомендовалось использовать Intents и писать код, аналогично тому, как я устанавливал изображение из галереи, но у меня на самом деле нет большого опыта использования Intents, кроме как начинать новое действие с макет добавлен к нему, и эти примеры были довольно запутанными.
TL; DR Мне нужно установить изображение в ImageView, имея только его URI - image.setImageURI (imgUri); не работает.
package com.example.kuba.myapplication;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.List;
import static com.example.kuba.myapplication.MainActivity.kidDatabase;
public class DescriptionActivity extends AppCompatActivity {
public static final int PICK_IMAGE = 1;
private static final String KIDS_DB = "kids_db";
private int kidId;
EditText descText;
Button imgBtn;
Button updateBtn;
ImageView image;
Uri imgUri = null;
Button refreshBtn;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_IMAGE) {
imgUri = data.getData();
image.setImageURI(imgUri);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_desc);
kidId = getIntent().getIntExtra("KID_ID", -1);
image = (ImageView) findViewById(R.id.imageView);
imgBtn = (Button) findViewById(R.id.picBtn);
refreshBtn = (Button) findViewById(R.id.refreshBtn);
descText = (EditText) findViewById(R.id.descEditText);
final String[] descFromDb = new String[2];
new Thread(new Runnable() {
@Override
public void run() {
descFromDb[0] = kidDatabase.daoAccess().getDesc(kidId);
descFromDb[1] = kidDatabase.daoAccess().getImgPath(kidId);
if (descFromDb[0] != null) {
descText.setText(descFromDb[0]);
}
if (descFromDb[1] != null) {
imgUri = Uri.parse(descFromDb[1]);
image.setImageURI(null);
image.setImageURI(imgUri);
}
}
}).start();
refreshBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
image.setImageURI(imgUri);
}
});
imgBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
}
});
updateBtn = (Button) findViewById(R.id.saveBtn);
updateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
Kid kid = kidDatabase.daoAccess().fetchKidById(kidId);
if (kid == null) {
return;
} else {
String description = descText.getText().toString();
kidDatabase.daoAccess().updateDescAndPath(kidId, description, imgUri.toString());
}
}
}).start();
Toast.makeText(getApplicationContext(), "Desc updated", Toast.LENGTH_LONG).show();
}
});
}
}
04-28 15:02:23.264 16941-17042/com.example.kuba.myapplication I/WAR:: imguri: content://com.android.providers.media.documents/document/image%3A47
04-28 15:02:23.267 16941-17042/com.example.kuba.myapplication W/ImageView: Unable to open content: content://com.android.providers.media.documents/document/image%3A47
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{fbe1f29 16941:com.example.kuba.myapplication/u0a84} (pid=16941, uid=10084) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
at android.os.Parcel.readException(Parcel.java:1684)
at android.os.Parcel.readException(Parcel.java:1637)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4199)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:5476)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2239)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1517)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1131)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:984)
at android.content.ContentResolver.openInputStream(ContentResolver.java:704)
at android.widget.ImageView.getDrawableFromUri(ImageView.java:900)
at android.widget.ImageView.resolveUri(ImageView.java:871)
at android.widget.ImageView.setImageURI(ImageView.java:490)
at android.support.v7.widget.AppCompatImageView.setImageURI(AppCompatImageView.java:115)
at com.example.kuba.myapplication.DescriptionActivity$1.run(DescriptionActivity.java:75)
at java.lang.Thread.run(Thread.java:761)
resolveUri failed on bad bitmap uri: content://com.android.providers.media.documents/document/image%3A47
04-28 15:02:23.378 16941-16946/com.example.kuba.myapplication I/art: Do partial code cache collection, code=60KB, data=59KB
After code cache collection, code=60KB, data=59KB
Increasing code cache capacity to 256KB