1

私は自分の問題の解決策を探しましたが、それを理解できないようです。おそらく 1 つまたは 2 つの単純な行であると確信しており、誰かが私を正しい方向に導くことができることを願っています。

私のアプリでは、ユーザーはボタンをクリックしてギャラリーを開くことができます。画像を選択すると、その画像がアプリ内の ImageView に表示されます。その部分は完全に正常に機能しています。もともと、ギャラリーから uri を返すだけで、次のように直接表示していました。

imageView1.setImageURI(myUri);

まあ、明らかに、ユーザーがそのページを数回続けてリロードすると、恐ろしい「メモリ不足」エラーが発生するので、コードをクリーンアップして画像を縮小する必要があります。これは、画像をビットマップに変換して縮小するビットマップ クラスを実装することで実現しました。さて、私の ImageView 表示コードは次のようになります。

imageView1.setImageBitmap(bitmap1);

その部分も正常に動作しています。ここに問題があります:

uri パスを文字列に変換し、それを SharedPreference に保存します。これは、ユーザーがアプリケーションを終了し、後で戻ってきたときに、設定した画像が自動的に表示されるようにするためです。uri を次のように変換します。

...
selectedImageUri = data.getData();
String selectedImagePath;
selectedImagePath = getPath(selectedImageUri);
...

SharedPreference 文字列を取得して uri に変換し、それを表示する古い方法は正常に機能していました。(もちろん、メモリ不足エラーを除いて)次のように見えました:

Uri myUri = Uri.parse(selectedImagePath);
imageView1 = setImageURI(myUri);

「selectedImagePath」は明らかに、SharedPreference から取得した文字列です。繰り返しますが、これは問題なく機能しましたが、何度もリロードするとエラーがスローされます。

現在動作していない部分は、ビットマップをスケーリングしてメモリエラーを発生させないように、新しいビットマップ変換を実装しようとしたときです。そのためのコードは次のとおりです。

Uri myUri = Uri.parse(selectedImagePath)
Bitmap bitmap = getThumbnail(myUri);
imageView1.setImageBitmap(bitmap);

これは何も表示しません。元の画像を選択すると画像は正常に表示されますが、この画面に戻って SharedPreference から文字列を解析し、ビットマップに変換しようとすると、何も表示されません。「getThumbnail」メソッドのコードは、この投稿から直接取得されました --->

Uri からビットマップを取得するには?

3回目のアンサーダウンです。

誰にもアイデアはありますか?非常に長い投稿で申し訳ありませんが、十分な情報を提供しないよりも、問題を説明しすぎたほうがよいでしょう。これがどこかで答えられていたらごめんなさい。私は何時間も他の質問を探していましたが、私の問題を解決するものは何も見つかりませんでした.

ありがとう。

4

1 に答える 1

10

私はそれを理解したので、このユニークな問題を抱えている他の人のために私がしたことはここにあります. ギャラリーから画像が選択され、インテントが返された後、次のコードを使用してそのインテントからデータを取得しました。

selectedImageUri = data.getData();

次に、これを介してパスを取得しました:

selectedImagePath = getPath(selectedImageUri);

この「getPath」メソッドを呼び出したのは次のとおりです。

public String getPath(Uri uri)  
{ 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
} 

次に、「selectedImagePath」を SharedPreference 文字列として保存しました。

後で、その文字列を取得して画像を表示するように変換するために、最初に SharedPreference 文字列を取得し、それを "selectedImagePath" に変換し直しました。次に、次のように ImageView に設定します。

targetImage = (ImageView)findViewById(R.id.imageView1);
targgetImage.setImageBitmap(decodeSampledBitmapFromResource(selectedImagePath, 200, 200));

次のメソッドを呼び出しました。

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 2;

if (height > reqHeight || width > reqWidth) {
    if (width > height) {
        inSampleSize = Math.round((float)height / (float)reqHeight);
    } else {
        inSampleSize = Math.round((float)width / (float)reqWidth);
    }
}
return inSampleSize;

}

public static Bitmap decodeSampledBitmapFromResource(String resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(resId, options);
}

かなり単純なタスクを実行するのは非常に多くのコードですが、機能するので、満足して先に進みます. うまくいけば、これは同じことを達成する必要がある他の誰かを助けるでしょう.

于 2012-07-02T21:51:52.073 に答える