ClipboardManagerでUriをコピーする


ClipboardManagerを使用してテキストのコピーと貼り付けを行う(Android3.0版)ではテキストのコピーを、ClipboardManagerでIntentをコピーするではIntentのコピーを紹介しましたが、今回はUriをコピーする方法を紹介します。

Uriのコピーは、WEBアドレスだけでなく、端末内のコンテンツの場所などもコピーできる為、非常に強力な機能です。

詳細は以下から。

Uriのコピー

UriのコピーはClipDataクラスのnewUri (ContentResolver resolver, CharSequence label, Uri uri)メソッドを使用して、ClipDataオブジェクトを作成してから、システムのクリップボードに作成したClipDataオブジェクトをセットします。(ClipDataの詳細はこちら)

//外部メモリから画像のUriを取得
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

//ClipDataオブジェクトの作成
ClipData cd = ClipData.newUri(getContentResolver(), "Uri", uri);

//システムのクリップボードオブジェクトを取得
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

//Uriをクリップボードへコピー
cm.setPrimaryClip(cd);

クリップボードからUriを取り出す

コピーしたUriを取り出すにはClipData.ItemクラスのgetUriメソッドを使用します。

Uriには様々なコンテンツのMIME typeがある為、クリップボードからの取得時に、目的のMIME typeであるかをしっかりと確認しなければなりません。

以下のサンプルはUriの取得からMIME typeの確認までを記載しています。

//システムのクリップボードオブジェクトを取得
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

//クリップボードからUriを取得
Uri uri = cm.getPrimaryClip().getItemAt(0).getUri();

//ContentResolverを取得
ContentResolver cr = getContentResolver();

//クリップボードから取得したUriのMime Typeを取得
String mimeType = cr.getType(uri);

if(mimeType != null){
    //MIME_TYPEが取得したいデータのものであるか確認
    if(mimeType.equals(MediaStore.Images.Media.CONTENT_TYPE)){
        Cursor pasteCursor = cr.query(uri, null, null, null, null);
        if(pasteCursor != null){
            if(pasteCursor.moveToFirst()){
                //データ取得処理
            }
        }
    }
}

15行目のMIME_TYPEの確認は画像データ用のMIME_TYPE定数を使用しています。

以下に画像以外の代表的なMIME_TYPEを紹介します。

MediaStore.Audio.Media.CONTENT_TYPE オーディオファイルのMIME_TYPEです
MediaStore.Video.Media.CONTENT_TYPE ビデオファイルのMIME_TYPEです