Android

シェアボタンなどで呼び出すChooserに『クリップボードにコピー』を追加する

More than 3 years have passed since last update.

device-2014-11-10-175436.png

アプリ内でシェアマークを押した時、こういったシェアの選択肢として

『クリップボードにコピーをする』を見かけることがあると思います。

実はこれはAndroidの標準機能ではなく、GoogleDriveの一Activityを呼び出しているため、

GoogleDriveがインストールされていない端末では『クリップボードにコピー』ボタンは表示されません。

よって、確実に『クリップボードにコピー』を表示させるためには、

アプリに独自のActivityを追加する必要があります。


MainActivity.java

/**

* Chooserにテキストシェア+クリップボードにコピーを表示する
*/

private void openShareChooser() {
// テキストシェアの暗黙Intent
Intent actionSendIntent = new Intent();
actionSendIntent.setAction(Intent.ACTION_SEND);
actionSendIntent.putExtra(Intent.EXTRA_TEXT, "シェアテキスト");
actionSendIntent.setType("text/plain");

// 追加するコピー機能のActivityのIntent
Intent myClipIntent = new Intent(this, ClipToCopyActivity.class);
myClipIntent.putExtra(ClipToCopyActivity.KEY_CLIP_TEXT, "コピーするテキスト");
LabeledIntent labeldIntent = new LabeledIntent(
myClipIntent
, getPackageName()
, "クリップボードにコピー" // Chooserに表示されるタイトル
, R.drawable.ic_launcher); // Chooserに表示されるアイコン
Intent[] intentArray = {labeldIntent};

// ChooserのIntentを作成
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INTENT, actionSendIntent);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);

startActivity(chooser);
}



ClipToCopyActivity.java

/**

* クリップボードにコピー機能を提供するActivity
*/

public class ClipToCopyActivity extends Activity {

public static String KEY_CLIP_TEXT = "clip_text";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String clipText = getIntent().getStringExtra(KEY_CLIP_TEXT);
if (!TextUtils.isEmpty(clipText)) {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(clipText);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("clip_text", clipText);
clipboard.setPrimaryClip(clip);
}
Toast.makeText(this, getString("クリップボードにコピーしました"),
Toast.LENGTH_SHORT).show();
finish();
}
}
}



AndroidManifest.xml

<activity

android:name="ClipToCopyActivity"
android:theme="@android:style/Theme.Translucent"/>

ちなみに、GoogleDriveのクリップボードにコピー機能は

com.google.android.apps.docs.app.SendTextToClipboardActivity

として呼び出すことができるので、独自のコピー機能と被って表示させたくなければ

PackageManager.queryIntentActivitiesで存在するかチェックしてもいいかもしれません。

参考:

http://stackoverflow.com/questions/24737622/how-add-copy-to-clipboard-to-custom-intentchooser

http://stackoverflow.com/questions/12109079/add-or-remove-options-from-createchooser