0

ギャラリーからビットマップを取得し、それを目的に使用するコードを使用しています。これはコードです:

protected void onActivityResult(int requestCode, int resultCode,Intent data) {                  
             if (resultCode == RESULT_OK) {
             Uri targetUri = data.getData();
             Bitmap bitmap = null;
             bitmap = BitmapFactory.decodeFile(getRealPathFromURI(targetUri));
                 //bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
            addMarker(bitmap);
            }
}

public String getRealPathFromURI(Uri contentUri) {
    // can post image
    String [] proj={MediaStore.Images.Media.DATA};
    Cursor cursor = managedQuery( contentUri,
    proj, // Which columns to return
    null, // WHERE clause; which rows to return (all rows)
    null, // WHERE clause selection arguments (none)
    null); // Order-by clause (ascending by name)
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
    }

実行中に何らかの理由でアプリがクラッシュします。問題は addMarker メソッドにはありません。テストした他のビットマップで問題なく動作しているためです。ギャラリーからのビットマップのみでは機能せず、クラッシュします。

それは私が得るエラーです:

09-29 21:28:35.960: E/AndroidRuntime(4746): 
java.lang.RuntimeException: Failure delivering result ResultInfo
{who=null, request=1, result=-1, data=Intent 
{ dat=content://media/external/images/media/3 }} to activity
{com.sit.augmented_reality/com.sit.augmented_reality.activity.Demo}: 
java.lang.NullPointerException
4

1 に答える 1

0

これには多くの問題があります。質問に正しく答えるには、スタックトレースが必要です。

ただし、明らかな問題は次のとおりです。

  1. (ほとんどの場合)内部で使用しているカーソルがgetRealPathFromURI閉じていません。メソッドから戻る前に閉じる必要があります。の値を保存してcursor.getString()からカーソルを閉じ、保存した値を返します。

  2. (可能性は低い)ビットマップのロード/メモリ不足の例外。ロードするビットマップを適切にクリーンアップする必要があります。Androidはビットマップを管理するという非常に悪い仕事をしています。この問題でOSとの戦いに2年間費やしてきた私は、現在、それらを管理するための基盤となるコードが壊れていると想定しています。StackOverflowとAndroidのマニュアルでこれを行う方法の例は無数にあります...

于 2012-09-29T19:07:05.237 に答える