2012-04-05 11 views
2

アンドロイドでファイルを開く方法を理解する助けがあります。私の具体的な問題は、画像ファイルを開くことと関係があります。私のアプリケーションでは、ユーザーは自分が選んだカメラアプリで画像を撮影し、次に返された画像を操作します。電話、アンドロイドのバージョン、および選択されたカメラアプリに応じて、私はonActivityResultで返されるさまざまなパラメータを取得します。 URIを取得することもあれば、単に画像を取得することもあれば、時には両方を取得することもあります。アンドロイドの場所に関係なく、Uriのファイルを開きます。

カメラを起動するためのコードは次のとおりです。

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(i, CAMERA_IMAGE); 

私は、その結果を受け取る:私はURIではなく、画像を取得するとき

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == CAMERA_IMAGE && resultCode == Activity.RESULT_OK) { 
     Log.d(TAG,"In onActivityResult"); 
     Bitmap imageBmp = null; 
     Uri imageUri = data.getData(); 

     if (data.getExtras() != null) { 
     imageBmp = (Bitmap)data.getExtras().get("data"); 
     Log.d(TAG,"Got Bitmap"); 
     } 
     ... 
    } 
} 

私の問題が発生します。 imageBmpがnullの場合、URIからイメージをロードする必要があります。私はいくつかのデバイス/アプリの組み合わせをテストしました。時には、URIが内部ストレージ上にあり、他の時間はSDカード上にあることがあります。ファイルがSDカードにある場合は、ファイルを取得するためにmanagedQueryを使用しました。

String[] proj = { MediaStore.Images.Media.DATA }; 
Cursor cursor = managedQuery(imageUri, proj, null, null, null); 
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);       
cursor.moveToFirst(); 
imageFileName = cursor.getString(column_index); 
File imageFile = new File(imageFileName); 
... 

内部ストレージにある場合、FileNotFoundExceptionが発生します。

私の具体的な質問は次のとおりです。ファイルシステム上の場所とは関係なく、URIのみを知っているファイルを開くにはどうすればよいですか?私は次のようなことをしたい:

File imageFile = new File(imageUri); 

しかし、ファイルはUriオブジェクトを受け入れません。私はそれを文字列に変換するための管理されたクエリを行います。

私のより一般的な質問は、なぜ私は最初にクエリを実行する必要があるのですか?返されるURIを使用できないのはなぜですか?

答えて

0

大丈夫です。あなたはファイル名を持っています。ただそれを開きます。それでおしまい。

+0

として渡された内部ファイルにアクセスするContentResolverのを使用する必要があります私は、ファイルが外部ストレージ上にあるとき、私はこのアプローチの唯一の成功だと示すために、質問を編集しました。時にはUriが内部ストレージを指していて、ファイルを見つけることができません。 –

8

あなたは、URI

ContentResolver cr = getContentResolver(); 
InputStream is = cr.openInputStream(imageUri); 
関連する問題