Androidアプリは共有ボタンをどのように実装しますか?


11

AndroidアプリケーションとAndroidが共有ボタンと共有メカニズムをどのように実装するのかと思っていました。たとえば、YouTubeの共有ボタンを押すと、共有するアプリのリストがポップアップ表示されます。このリストはどのように決定されますか?特定の「共有」インテントはありますか?次に、インテントエクストラで提供されているタイプのインテントを共有できるすべてのスポットが表示されますか?これを実装するために使用される設計パターンの技術名は何ですか?ありがとう。


1
あなたは本当に「うんち」を意味しましたか、それとも「ポップス」のタイプミスですか?少なくともアメリカ英語では、前者は赤ちゃんがおむつに何をするかです。
JDługosz

あなたが正しい。最近、AndroidのSwypeキーボードに切り替えました。これにより、入力が速くなりましたが、時々間違った単語が入力されて気付かないことがあります。どうすればいいのかまだわからないので、あまり気をつけていません。時々潜水艦の中に入り、画面を正しく見ることさえできない。
Jack Maddington、2016年

サブ(潜水艦?)に!何をすべきか:提出する前に校正する。また、恥ずかしい言葉で予測リストを汚さないでください。
JDługosz

偶然にも、私の予測リストは古いメールからのものでいっぱいで、Swypeが自動的に読んだ。うわぁ!
Jack Maddington、2016年

回答:


10

これには2つの部分があります。通信アプリが物事を共有できると言うメカニズムと、アプリがコンテンツを共有できるメカニズムです。一度に1つずつ扱いますが、最初にインテントについて簡単に説明します。

意図

Android のインテントは、アプリの起動に使用されるものです。ショートカットのように、またはWindowsファイルの関連付けのように機能します。インテントは、起動するアプリの名前を指定できますが、必須ではありません。また、実行するアクション(「メインアクティビティを開く」、「このURLを表示する」、「カレンダーエントリを作成する」など)と、アクションの対象となるオブジェクトのMIMEタイプ(たとえば、表示したいもの)を指定することもできます。タイプはimage / jpegです)。アクションの名前には、特定のアプリに固有のものもありますが、多くのアプリはAndroidによって標準化されており、アプリの相互作用を可能にしています。

インテントフィルターと通信アプリ

各アプリは、実行できるアクションの種類を示すインテントフィルターを指定します。たとえば、画像ビューアアプリは、MIMEタイプが「image / *」である「このURLを表示する」ためのインテントフィルタを登録します。Webブラウザーは、URLスキームが「http」または「https」である「このURLを表示する」ためのインテントフィルターを登録します。物事を共有できるようにするために、アプリは「送信」インテントのインテントフィルターを特定のタイプ(例:写真のみを共有できる場合)または任意のタイプで登録します。

コンテンツアプリ

一部のコンテンツを共有するアプリは、「共有」アクションと共有するコンテンツを指すURLを使用してインテントを作成します。(これは、多くの場合、コンテンツアプリのプライベートストレージ内のファイル、またはコンテンツアプリによって生成されたストリームへの一時的なアクセスを受信アプリに与える「一時的な」URLです。)を処理するアプリの名前を指定していません。意図。次に、その意図をAndroidフレームワークに与え、Androidに選択ダイアログを表示するように要求します。Androidは、インテントをすべてのインストール済みアプリのインテントフィルターと比較し、リストを作成してユーザーに表示します。ユーザーが特定のアプリを選択すると、Androidはそのアプリを起動してインテントを渡します。アプリはURLを使用して、元のアプリからコンテンツを取得します。

マシュマロの新機能:直接共有

マシュマロには、直接共有と呼ばれる別のメカニズムがあります。これはインテントメカニズムを補完するものであり、「だれに送信しますか」という追加のステップをスキップして、選択ダイアログから直接共有するユーザーまたはグループを選択できます。これは少し異なります。通信アプリはサービスを提供する必要があります。コンテンツを含むアプリがセレクターを要求すると、Androidは関連する各アプリのサービスを開始します。サービスは関連する共有ターゲットのリストを返し、Androidはそれらすべての個別のリストをダイアログに表示されるリストにまとめます。


しかし、アプリがかなりの数の異なる選択ダイアログを表示するのを見てきました。それらはすべて本当にOSによって表示されますか、それともアプリ自体がターゲットのリストを取得できますか?
user1686 2016年

@grawity組み込みダイアログにはいくつかのカスタマイズオプション(タイトルの設定など)がありますが、アプリがAndroidに共有ターゲットのリストを要求し、独自のダイアログに配置することもできます。私のブラウザーセレクターbURLyはこの例ですが、「送信」インテントの代わりに「オープンURL」インテントを使用しています。
Dan Hulme、

11

私はManifest開発者ではないので、私は生の説明をすることができます:アプリは、彼らが理解し、共有アクションで応答する意思があるMimetypeを宣言します。このために、いわゆる「インテントフィルター」を定義します。例:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/*" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="message/*" />
    <data android:mimeType="multipart/*" />
    <data android:mimeType="text/*" />
    <data android:mimeType="video/*" />
</intent-filter>

そのため、「共有」ボタンを押すたびに、共有するコンテンツが評価され、フォーマットを受け取る意欲を宣言したアプリと照合されます。

ソース:


1
それはほとんど直接です。自分自身で(共有している)アプリは、意図的回答者の一部をフィルタリングできますが、ほとんどはフィルタリングできません。
coteyr 2016年

2
@HiltonShumwayそれが私が彼の答えに賛成した理由です。私以外のダンは開発に適していて、物事がどのように連携するかをよく知っています。だから私が私の答えを投稿したとき、私も彼がそれを投稿してくれることを望んでいました–彼は私の希望を失望させませんでした:)
Izzy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.