web-dev-qa-db-ja.com

Android M、「直接共有」機能(画像、テキスト)を構成する方法、およびアイテムをクエリする方法は?

バックグラウンド

Android M(link here )の新機能によると、アプリは、そのアクティビティの1つに直接共有インテントを与えることを提案できます。たとえば、チャットアプリがコンテンツを正確な連絡先と共有できるため、チャットアプリと連絡先の両方を同時に選択できます(1つのステップ2)の代わりに。これはこの画像に表示できます:

enter image description here

または、少なくともそれは私がそれから理解したことです。

質問

この新機能に関して2つの質問があります。

  1. 説明では、マニフェストに何を入れるかを示しているだけで、「ChooserTargetService」の使用について言及しています。テキストと画像を提供するために何をすべきですか?

  2. 反対の方法を知りたいのですが、これらの「直接共有」アイテム(画像、テキスト、インテント)をすべてクエリして、カスタマイズされたダイアログに表示するにはどうすればよいですか?

    自分でカスタマイズしたダイアログがあり、どのアプリからだけでなく、何をどのように共有するかを選択できるので、やりたいと思っています。

20

質問1

説明では、マニフェストに何を入れるかを示しているだけで、「ChooserTargetService」の使用について言及しています。テキストと画像を提供するために何をすべきですか?

ChooserTargetServiceを拡張することから始めます。 ListChooserTargetを返す必要があり、それらのターゲットを作成する方法は完全にあなた次第です。

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

次に、ChooserTargetServiceAndroidManifestを宣言し、次の2つのことを行う必要があります。

  1. Android.permission.BIND_CHOOSER_TARGET_SERVICE権限を使用してServiceをバインドします
  2. 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"));

結果

results

注意事項

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に提供されるデータは動的です。したがって、私が知る限り、これらのアイテムに直接アクセスする方法はありません。

17
adneal

私はこの未来について異なる理解を持っています。

これまで、ユーザーが何かを共有したいときは、共有したいアプリケーションを選択するように求められ、その後、このアプリケーションが共有を処理していました。

これで、ユーザーがアプリケーションを選択する代わりに、共有を処理するアプリケーションからコンテンツを選択します。このような各オプションは、Android.service.chooser.ChooserTargetServiceにカプセル化されています。

したがって、画像に表示されているように、ChooserTargetServiceのいくつかの製品が表示され、ユーザーはまだ昼食や共有をせずにいくつかの連絡先UIを表示します。

あなたの対話も同じように引き起こされると思います。

0
Ilya Gazman