*//Sorry for bad eng, but in stackoverflow.ru I have no answers you my last chance*
後URIから画像を読み込むことができません私はゲーラリーから画像\写真を取る必要があります1つの活性を有するアプリ、sharedPreferences
でこの画像\写真のuri
を保存し、リロード後、アプリのロードイメージからを持っていますだから、ImageViewのリロードアプリ
でuri
を保存し、後のアプリでuri
正常に保存され、負荷をリロードしますが、アプリがuri
から写真をロードし、代わりに私が空きスペースを持っていた画像が、ImageView
が存在し、[OK]をすべてuri
ロードされたと(私がロードされて比較することはできませんuri
およびuri
は同等です)。 I以下
私のコードやスクリーンショットを添付:
のxml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="ua.bellkross.testapp.MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
app:srcCompat="@drawable/myphoto2" />
</LinearLayout>
のjava:
package ua.bellkross.testapp;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
ImageView imageView;
SharedPreferences sharedPreferences;
String photoUri;
boolean can;
final int GALLERY_REQUEST = 1;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
loadPhoto();
imageView.setOnClickListener(this);
}
@Override
protected void onStop() {
super.onStop();
savePhoto();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.imageView :
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, GALLERY_REQUEST);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Uri selectedImage = data.getData();
imageView.setImageURI(selectedImage);
photoUri = selectedImage.toString();
Log.d("myLog", "savedURI == " + photoUri);
can = true;
}
private void savePhoto(){
sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("uri",photoUri);
editor.putBoolean("edited",can);
editor.commit();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void loadPhoto(){
sharedPreferences = getPreferences(MODE_PRIVATE);
if(sharedPreferences.getBoolean("edited",false)) {
String savedURI = sharedPreferences.getString("uri", null);
if (!savedURI.equals(null)) {
Log.d("myLog", "savedURI!=null");
imageView.setImageURI(Uri.parse(savedURI));
Log.d("myLog", "savedURI == " + savedURI);
}
}
can = false;
}
}
//I have no reputation to post images and more than 2 links
https://i.stack.imgur.com/hveS0.jpg - start app
https://i.stack.imgur.com/UrzHF.jpg - take image from galery
https://i.stack.imgur.com/Cwy37.jpg - after reload app
私はそれを修正しましたか?
1)を確認保存とゲーラリーからuri
でuri
をロードされた - 彼らは等しく、私はログ
05-09 22:05:24.893 524-524/ua.bellkross.testapp D/myLog: savedURI(OnActivityResult) == content://media/external/images/media/16493
05-09 22:05:29.505 1294-1294/? D/myLog: savedURI!=null
05-09 22:05:29.510 1294-1294/? D/myLog: savedURI == content://media/external/images/media/16493
2でこれをやった)代わりにsharedPreferences
getSharedPreferences
を使用してください - それは
3を助けていないのです)画像の読み込み前にimageView.setImageURI(null)
、imageView.invalidate()
、imageView.postInvalidate()
を試してみてください。役に立たないです。
4)@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
からの私のAndroidバージョンのチェックバージョン - 彼らは等しく、すべてOK
5)media/external/images/media/16493
にcontent://media/external/images/media/16493
からuri
を変更してください -
6)を使用してください助けにはならなかったonRestoreInstanceState
とonSaveInstanceState
- それは助けにはならず、onRestoreInstanceState
は画面の向きを変更したときにのみ開始されますが、リロード後には開始されません。
あなたがそれを自分で実行するか、類似のアプリを書いても(5〜10分かかります)、このアプリは動作します - 比較では間違いがあります。
Guysは、私はこのために感謝し、答えを見つける -
をgreenapps私はちょうどで書き、オープンストリームInputStream is = getContentResolver().openInputStream(uri);
を試してみて、スタックトレースを取得し、いくつかの文字列ので
05-10 16:13:40.081 1264-1286/? E/DatabaseUtils: Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/18553 from pid=8465, uid=10268 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
を見つけましたAndroidManifest
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
保存したURIのInputStreamを開こうとすると、テストを行ってください。 InputStream is = getContentResolver()。openInputStream(uri);あなたがそれを開くことができるかどうか報告してください。それはonActivityResultとそれ以降の再起動の両方で行います。 – greenapps
onActivityResultすべてでOK しかし、私が "InputStream is = getContentResolver()。openInputStream(Uri.parse(photoUri));" loadPhoto()で例外が発生します – Bellkross
OH、本当にありがとうございます! 私は答えを見つけました 私はAndroid Manifestに書き込むべきです uses-permission> 私はスタックトレースを読み、電話で画像を検索するために "android.permission.READ_EXTERNAL_STORAGE" –
Bellkross