2017-05-10 4 views
1
*//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)を確認保存とゲーラリーからuriuriをロードされた - 彼らは等しく、私はログ

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でこれをやった)代わりにsharedPreferencesgetSharedPreferencesを使用してください - それは

3を助けていないのです)画像の読み込み前にimageView.setImageURI(null)imageView.invalidate()imageView.postInvalidate()を試してみてください。役に立たないです。

4)@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)からの私のAndroidバージョンのチェックバージョン - 彼らは等しく、すべてOK

5)media/external/images/media/16493content://media/external/images/media/16493からuriを変更してください -

6)を使用してください助けにはならなかったonRestoreInstanceStateonSaveInstanceState - それは助けにはならず、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> 
+0

保存したURIのInputStreamを開こうとすると、テストを行ってください。 InputStream is = getContentResolver()。openInputStream(uri);あなたがそれを開くことができるかどうか報告してください。それはonActivityResultとそれ以降の再起動の両方で行います。 – greenapps

+0

onActivityResultすべてでOK しかし、私が "InputStream is = getContentResolver()。openInputStream(Uri.parse(photoUri));" loadPhoto()で例外が発生します – Bellkross

+0

OH、本当にありがとうございます! 私は答えを見つけました 私はAndroid Manifestに書き込むべきです 私はスタックトレースを読み、電話で画像を検索するために "android.permission.READ_EXTERNAL_STORAGE" – Bellkross

答えて

1

はで最初にnullにImageViewのを設定し、このように、通常はそれを設定しよう:

imageView.setImageURI(null); 
imageView.setImageURI(Uri.parse(savedURI)); 
0

は、私がオープンストリーム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> 
+0

あなたはAndroidのために6歳以上で開発しているようですが、実行時に許可を求める必要があります。だから準備する;-)。 – greenapps

+0

ha ....今私は理解しています....それは最初に新しい質問のように思えました...それについてはごめんなさい... :)質問に編集を見たことがありませんでした。それは文脈で... – Opiatefuchs