<< Android-Note
クリップボードのコピーを感知するには
Androidでテキストがコピーされたりカットされたりしたときに、それを感知したい場合はClipboardManagerのOnPrimaryClipChangedListenerを利用します。
ここではその使い方を簡単に紹介します。
OnPrimaryClipChangedListenerとは
クリップボードの変化(コピー・カット)が感知されるとonPrimaryClipChangedメソッドが呼び出されます。
その時次のようにしてコピーされたテキストを取得できます。
ClipboardManager cm = (ClipboardManager) getSystemService( Context.CLIPBOARD_SERVICE); cm.addPrimaryClipChangedListener( new ClipboardManager.OnPrimaryClipChangedListener() { @Override public void onPrimaryClipChanged() { String copiedText = cm.getPrimaryClip().getItemAt(0).getText().toString(); Toast.makeText( this, "コピーされたテキスト : " + copiedText, Toast.LENGTH_LONG).show(); } } );
コピーまたはカットされたテキストはgetPrimaryClipから取得できます。
たったこれだけですがバックグラウンドでコピーなどを感知したい場合は少し工夫が必要になります。
次はその実装方法を紹介します・
バックグラウンドでコピーを感知するには
では、どうやるかというと初めにコピーを感知するサービスクラスを作成します。
例えば ClipService という名前で次のようなサービスクラスを作ります。
ClipService.java/** クリップボードの変化を感知するサービス */ public class ClipService extends Service { private ClipboardManager cm; @Override public int onStartCommand(Intent intent, int flags, int startId) { cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); cm.addPrimaryClipChangedListener( new ClipboardManager.OnPrimaryClipChangedListener() { @Override public void onPrimaryClipChanged() { String copiedText = cm.getPrimaryClip().getItemAt(0).getText().toString(); Toast.makeText( ClipService.this, "コピーされたテキスト : " + copiedText, Toast.LENGTH_LONG).show(); } }); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } }
onStartCommandメソッドでコピー感知の処理を実装しています。
次にこのサービスをマニフェストファイルに追加します。
AndroidManifest.xmlの一部
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 次を追加 -->
<service android:name="com.xxx.myapp.ClipService" />
</application>
そしてActivityクラスなどでサービスを起動すればOKです。
MainActivity.javapublic class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** サービスを起動 */ Intent intent = new Intent(this, ClipService.class); startService(intent); } }
これでアプリがバックグラウンドにいても問題なくコピーやカットを検知可能です。
以上、クリップボードのコピーを感知する方法について紹介しました。
関連項目
© Kaz