11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Android】「Uri」から「ファイル名」を取得する

Last updated at Posted at 2017-11-24

#「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」を前提としたサンプルコード)

ic_launcher.png
シンプルなメモ帳は文字数もカウントする-カラーラベルや並べ替えを搭載した無料ノート-NOTEBOSS

【動作環境】
Android OS 5.0以上

Made in Japan.
© CUTBOSS
Producer & Director, Boss of the Barber.
Lead Programmer & Designer, Boss of the Barber.

header_2_ja.png

#関連記事

#参考記事

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?