クリップボードのコピーを感知するには

Androidでテキストがコピーされたりカットされたりしたときに、それを感知したい場合はClipboardManagerOnPrimaryClipChangedListenerを利用します。

ここではその使い方を簡単に紹介します。

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.java
public 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);
    }
    
}

これでアプリがバックグラウンドにいても問題なくコピーやカットを検知可能です。

以上、クリップボードのコピーを感知する方法について紹介しました。

関連項目