#「Uri」の「スキーム」はひとつじゃない
例えば、「コンテンツマネージャー」アプリからファイルを取得すると、その「Uri」は
file:///storage/emulated/0/Documents/xxxxxxxx_xxxxxx.txt
となっている(「xxxxxxxx_xxxxxx」はファイル名)。
また、「Gmail」アプリの添付ファイルを取得すると、
content://gmail-ls/xxxxxxx.xxxxxxxxx@gmail.com/messages/36536/attachments/0.1/BEST/false
となっている(「xxxxxxx.xxxxxxxxx」はアカウント名)。
このように、アプリや、その操作方法によって、それぞれ**異なるスキーム(file、content)**になることが当然のようにある。
それを当然の前提として踏まえた上で、「Uri」から「ファイル名」を正しく取得したい。
#サンプルコード
以下をユーティリティみたいにして使っている。
/**
* Get the file name from uri.
*
* @param context context
* @param uri uri
* @return file name
*/
public static String getFileNameFromUri(@NonNull Context context, Uri uri) {
// is null
if (null == uri) {
return null;
}
// get scheme
String scheme = uri.getScheme();
// get file name
String fileName = null;
switch (scheme) {
case "content":
String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
Cursor cursor = context.getContentResolver()
.query(uri, projection, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
fileName = cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME));
}
cursor.close();
}
break;
case "file":
fileName = new File(uri.getPath()).getName();
break;
default:
break;
}
return fileName;
}
(※「minSdkVersion 21:Lollipop」を前提としたサンプルコード)
#サンプルアプリ
以下のメモ帳アプリには「他アプリからメモを登録」できる機能があるのだが、「コンテンツマネージャー」や「Gmail」の添付ファイルを開いてこのメモ帳アプリに共有すると、Toolbarのタイトル部分に「ファイル名」が表示される。
これは、本記事の方法でUriから取得したファイル名なので、良ければ、是非、色々なアプリから共有してみてほしい。
ただ、拡張子は以下のようにして、外している。
/**
* Remove file name extension.
*
* @param fileName file name
* @return file name with extension removed
*/
public static String removeFileNameExtension(String fileName) {
// is null
if (null == fileName) {
return null;
}
// get point index
int point = fileName.lastIndexOf(".");
if (-1 < point) {
return fileName.substring(0, point);
}
return fileName;
}
引数(String fileName)が「xxxxxxxx_xxxx.txt」というファイル名であれば、戻り値は「xxxxxxxx_xxxx」となる。
上記もユーティリティみたいにして使っている。
(※「minSdkVersion 21:Lollipop」を前提としたサンプルコード)
シンプルなメモ帳は文字数もカウントする-カラーラベルや並べ替えを搭載した無料ノート-NOTEBOSS
【動作環境】
Android OS 5.0以上
Made in Japan.
© CUTBOSS
Producer & Director, Boss of the Barber.
Lead Programmer & Designer, Boss of the Barber.
#関連記事
#参考記事