Android M(link here )の新機能によると、アプリは、そのアクティビティの1つに直接共有インテントを与えることを提案できます。たとえば、チャットアプリがコンテンツを正確な連絡先と共有できるため、チャットアプリと連絡先の両方を同時に選択できます(1つのステップ2)の代わりに。これはこの画像に表示できます:
または、少なくともそれは私がそれから理解したことです。
この新機能に関して2つの質問があります。
説明では、マニフェストに何を入れるかを示しているだけで、「ChooserTargetService」の使用について言及しています。テキストと画像を提供するために何をすべきですか?
反対の方法を知りたいのですが、これらの「直接共有」アイテム(画像、テキスト、インテント)をすべてクエリして、カスタマイズされたダイアログに表示するにはどうすればよいですか?
自分でカスタマイズしたダイアログがあり、どのアプリからだけでなく、何をどのように共有するかを選択できるので、やりたいと思っています。
質問1
説明では、マニフェストに何を入れるかを示しているだけで、「ChooserTargetService」の使用について言及しています。テキストと画像を提供するために何をすべきですか?
ChooserTargetService
を拡張することから始めます。 List
のChooserTarget
を返す必要があり、それらのターゲットを作成する方法は完全にあなた次第です。
public class YourChooserTargetService extends ChooserTargetService {
@Override
public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
final List<ChooserTarget> targets = new ArrayList<>();
for (int i = 0; i < length; i++) {
// The title of the target
final String title = ...
// The icon to represent the target
final Icon icon = ...
// Ranking score for this target between 0.0f and 1.0f
final float score = ...
// PendingIntent to fill in and send if the user chooses this target
final PendingIntent action = ...
targets.add(new ChooserTarget(title, icon, score, action));
}
return targets;
}
}
AndroidManifest
次に、ChooserTargetService
でAndroidManifest
を宣言し、次の2つのことを行う必要があります。
Android.permission.BIND_CHOOSER_TARGET_SERVICE
権限を使用してService
をバインドしますAndroid.service.chooser.ChooserTargetService
アクションにIntentFilter
を含めます例えば:
<service
Android:name=".YourChooserTargetService"
Android:label="@string/yourLabel"
Android:permission="Android.permission.BIND_CHOOSER_TARGET_SERVICE">
<intent-filter>
<action Android:name="Android.service.chooser.ChooserTargetService" />
</intent-filter>
</service>
Activity
を処理するIntent
に、meta-data
タグAndroid.service.chooser.chooser_target_service
を追加する必要があります。例えば:
<activity Android:name=".YourShareActivity">
<intent-filter>
<action Android:name="Android.intent.action.SEND" />
<category Android:name="Android.intent.category.DEFAULT" />
<data Android:mimeType="text/plain" />
</intent-filter>
<meta-data
Android:name="Android.service.chooser.chooser_target_service"
Android:value=".YourChooserTargetService" />
</activity>
ここからは、ほとんどの場合、 Intent.createChooser
を呼び出して、ユーザーがアプリケーションを選択した場合にデータを処理するだけです。
final Intent target = new Intent(Intent.ACTION_SEND);
target.setType("text/plain");
target.putExtra(Intent.EXTRA_TITLE, "Your title");
target.putExtra(Intent.EXTRA_TEXT, "Your text");
startActivity(Intent.createChooser(target, "ChooserTargetService Example"));
結果
注意事項
各ChooserTarget
のランキングスコアは、ターゲットを並べ替えるために使用されますが、UIがそれを使用することを決定した場合にのみ使用されます。 ChooserTarget.getScore
による
ターゲットを表示するUImayは、複数のソースからのターゲットを並べ替えてマージするときに、このスコアを考慮に入れます
また、私が知る限り、この機能は実際にはまだAndroid MNCプレビューに実装されていません。ChooserActivity
にはTODO
が含まれています。
TODO:スコアをランク付けして並べ替えを維持する
新しいAndroid.graphics.drawable.Icon
を作成するときは、static
初期化子の1つを使用する必要があります。
Icon.createWithBitmap();
Icon.createWithContentUri()
Icon.createWithData()
Icon.createWithFilePath()
Icon.createWithResource()
質問2
反対の方法を知りたいのですが、これらの「直接共有」アイテム(画像、テキスト、インテント)をすべてクエリして、カスタマイズされたダイアログに表示するにはどうすればよいですか?
ChooserTargetService.onGetChooserTargets
に提供されるデータは動的です。したがって、私が知る限り、これらのアイテムに直接アクセスする方法はありません。
私はこの未来について異なる理解を持っています。
これまで、ユーザーが何かを共有したいときは、共有したいアプリケーションを選択するように求められ、その後、このアプリケーションが共有を処理していました。
これで、ユーザーがアプリケーションを選択する代わりに、共有を処理するアプリケーションからコンテンツを選択します。このような各オプションは、Android.service.chooser.ChooserTargetService
にカプセル化されています。
したがって、画像に表示されているように、ChooserTargetService
のいくつかの製品が表示され、ユーザーはまだ昼食や共有をせずにいくつかの連絡先UIを表示します。
あなたの対話も同じように引き起こされると思います。