私は画像の絶対パスを知っています(例えば/sdcard/cats.jpg)。このファイルの内容URIに何か方法はありますか?
実際に私のコードでは、画像をダウンロードして特定の場所に保存しています。現在ImageViewで画像を設定するには、パスを使用してファイルを開き、バイトを取得してビットマップを作成してからImageViewでビットマップを設定します。これは非常に遅いプロセスですが、代わりにコンテンツを取得できれば、メソッドImageView.setImageUri(uri)
を非常に簡単に使用できます。
試してみてください。
ImageView.setImageURI(Uri.fromFile(new File("/sdcard/cats.jpg")));
または幅:
ImageView.setImageURI(Uri.parse(new File("/sdcard/cats.jpg").toString()));
UPDATE
ここでは、あなたのメディア(Image/Video)が既にコンテンツメディアプロバイダーに追加されていると仮定しています。そうでない場合、あなたはあなたが望むものとしてコンテンツURLを正確に取得することができません。代わりにファイルUriがあります。
ファイルエクスプローラの動作についても同じ質問がありました。あなたはファイルのcontenturiがimage、オーディオとビデオのようなメディアストアデータだけをサポートすることを知っているべきです。私はあなたにSDカードから画像を選択することから画像コンテンツのURIを取得するためのコードを与えています。このコードを試してください、多分それはあなたのために働くでしょう...
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
cursor.close();
return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
//このコードは2.2上の画像に対して機能します。
//Your file path - Example here is "/sdcard/cats.jpg"
final String filePathThis = imagePaths.get(position).toString();
MediaScannerConnectionClient mediaScannerClient = new
MediaScannerConnectionClient() {
private MediaScannerConnection msc = null;
{
msc = new MediaScannerConnection(getApplicationContext(), this);
msc.connect();
}
public void onMediaScannerConnected(){
msc.scanFile(filePathThis, null);
}
public void onScanCompleted(String path, Uri uri) {
//This is where you get your content uri
Log.d(TAG, uri.toString());
msc.disconnect();
}
};
承認された解決策は、おそらくあなたの目的のための最善の策ですが、実際には件名で質問に答えることです。
私のアプリでは、URIからパスを取得し、パスからURIを取得する必要があります。前者:
/**
* Gets the corresponding path to a file from the given content:// URI
* @param selectedVideoUri The content:// URI to find the file path from
* @param contentResolver The content resolver to use to perform the query.
* @return the file path as a string
*/
private String getFilePathFromContentUri(Uri selectedVideoUri,
ContentResolver contentResolver) {
String filePath;
String[] filePathColumn = {MediaColumns.DATA};
Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
cursor.close();
return filePath;
}
後者(私はビデオのためにしますが、MediaStore.Videoの代わりにMediaStore.Audio(等)を使うことによってオーディオやファイルあるいは他のタイプの保存されたコンテンツのためにも使うことができます)
/**
* Gets the MediaStore video ID of a given file on external storage
* @param filePath The path (on external storage) of the file to resolve the ID of
* @param contentResolver The content resolver to use to perform the query.
* @return the video ID as a long
*/
private long getVideoIdFromFilePath(String filePath,
ContentResolver contentResolver) {
long videoId;
Log.d(TAG,"Loading file " + filePath);
// This returns us content://media/external/videos/media (or something like that)
// I pass in "external" because that's the MediaStore's name for the external
// storage on my device (the other possibility is "internal")
Uri videosUri = MediaStore.Video.Media.getContentUri("external");
Log.d(TAG,"videosUri = " + videosUri.toString());
String[] projection = {MediaStore.Video.VideoColumns._ID};
// TODO This will break if we have no matching item in the MediaStore.
Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(projection[0]);
videoId = cursor.getLong(columnIndex);
Log.d(TAG,"Video ID is " + videoId);
cursor.close();
return videoId;
}
基本的に、DATA
のMediaStore
列(またはクエリしているサブセクションのいずれか)にファイルパスが格納されているので、その情報を使用して検索します。
用途に応じてこれら2つの方法を使用できます。
Uri uri = Uri.parse("String file location");
または
Uri uri = Uri.fromFile(new File("string file location"));
私は両方の方法と両方の作品を試してみました。
FileからContent Uri content://
を作成する最も簡単で確実な方法は FileProvider を使うことです。 FileProviderによって提供されるUriは、他のアプリとファイルを共有するためのUriの提供にも使用できます。 File
の絶対パスからFile Uriを取得するには、DocumentFile.fromFile(new File(path、name))を使用できます。これはApi 22で追加され、以下のバージョンではnullを返します。
File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
AdbシェルCLIコマンドを使用して、コードを書かずにファイルIDを取得します。
adb Shell content query --uri "content://media/external/video/media" | grep FILE_NAME | grep -Eo " _id=([0-9]+)," | grep -Eo "[0-9]+"
U以下のコードスニペットを試すことができます
public Uri getUri(ContentResolver cr, String path){
Uri mediaUri = MediaStore.Files.getContentUri(VOLUME_NAME);
Cursor ca = cr.query(mediaUri, new String[] { MediaStore.MediaColumns._ID }, MediaStore.MediaColumns.DATA + "=?", new String[] {path}, null);
if (ca != null && ca.moveToFirst()) {
int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
ca.close();
return MediaStore.Files.getContentUri(VOLUME_NAME,id);
}
if(ca != null) {
ca.close();
}
return null;
}
その後半ですが、将来的に誰かを助けるかもしれません。
ファイルのコンテンツURIを取得するには、次の方法を使用できます。
FileProvider.getUriForFile(Context context, String authority, File file)
コンテンツURIを返します。