変化を求める人

Androidでクリップボード処理、HTMLタグもコピーしていた。

   

今回はAndroidでクリップボードの内容を取得する。本家ガイドのメモ。

詳しい内容は
Android Developers – API Guides > Copy and Paste を確認。

クリップボードを扱う際に必要なもの

ClipboardManager

クリップボードにアクセスするために使用する
getSystemService(CLIPBOARD_SERVICE)で取得する。

ClipData

クリップボードで使用されるオブジェクト
形式情報(ClipDescription)と1つ以上のデータ本体(Item)を内部に持つ。

注:クリップボードが保持できるClipDataオブジェクトは一度に1つだけ。新しいClipDataをクリップボードに置くと、以前のClipDataは消える。

リスナー

クリップボードの変更を監視したい場合
ClipboardManager.OnPrimaryClipChangedListener
void onPrimaryClipChanged() を実装。
それを
ClipboardManager#addPrimaryClipChangedListener()でセットする。

なお、リスナー内でクリップボードに書き込むと無限ループになるので注意。

テキストの取得

3つのデータ形式(4.1以上はhtmlも扱える)

Androidのクリップボードが扱うオブジェクトの形式は
 1.Text
 2.URI コンテンツプロバイダで利用されるURI。
 3.Intent
の3つ
注:APIlevel16(4.1)から、text/plainだけでなくtext/htmlにも対応した模様。

例) lgl22(4.4.2)、Chromeで画像をコピーしたときのClipDataの内容は
 MIMEタイプ: text/html
 Text: 画像のURL
 Uri: null
 Intent: null
 HtmlText: <img src=”画像のURL”>
画像データそのものは コピーしていない。

これをEditTextに張り付けると、ただの文字列しか保存していないはずなのに変な画像みたいなのが挿入された。
このままでは気持ちが悪いのでちょっと調べてみた。

HTMLへの対応

なぜ画像をコピーしたわけではないのに、変な画像が挿入されたのか?
それは htmlタグ までコピーされているから。

TextViewやEditTextではHTMLタグを使って文字列を装飾することができる。
それらのビューでは文字列を挿入する際に、ただの文字列として渡すだけでなく、HTMLとして渡すことが出来るらしい。

AndroidのChromeブラウザの場合
文字列コピーでは、Textに文字列、HtmlTextには装飾するためのHTMLタグを含めた文字列。
画像のコピーでは、Textに画像のURL、HtmlTextにはimgタグ付きでコピーされていた。

そして、EditTextに貼り付けを行う際、
ClipData.Item の HtmlText がnullでない場合そちらを優先的に解析して張り付けていると思われる。
その結果、ただの文字列コピーではなく、HTMLとして装飾を含めたコピーがされる。

なお、MIMEタイプでhtml/plainを指定していても、張り付ける際にHtmlTextにデータが入っているとそちらが使われる模様。

このあたりが影響しているのではないかと
Android – Html
Android – ImageSpan

ChromeというよりWebViewの仕様とかかもしれないけど、そこまでは調べてないのでわかりません。

今回はここまで

 - android, android - api , ,

スポンサーリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

Android Serviceのメモ。onBind,onRebind,onUnbindが呼ばれる条件

onBindやonUnbindが呼ばれるタイミングが紛らわしかったのでメモ。 個 …

AndroidStudioでコピペする方法。デフォルトではクリップボードから貼り付けできない

AndroidStudioでは外部アプリからのコピペがデフォルトだと出来ない。 …

Androidアプリの「デフォルトで起動」設定の初期化

Androidでは、処理ごとに担当するアプリが決まっています。その都度、必要なア …

Android「標準ブラウザ」から「Chrome」へブックマークを移行する方法

追記 久々に確認してみたところ、この記事の方法は出来なくなっていました。[現時点 …

Android4.3以下の場合、標準ブラウザは無効推奨らしいのでその方法。

先日、ブックマークについての記事を書きました。 その際、親が利用していたのは「標 …