筆記:分享圖片/文字/HTML到其他App

分享文字/圖片到其他App,例如FB、Line

以前分享文字

以前分享文字,自己寫intent,然後開啟Activity

static Intent getSendTextIntent(String text) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, text);
    return intent;
}

startActivity(getSendTextIntent("Hello, just do a test!"));

一般還會建議應該再判斷是否可以啟動Activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

現在分享文字

現在用ShareCompat就好了
import android.support.v4.app.ShareCompat;
最新的JetPack是引用
import androidx.core.app.ShareCompat;

ShareCompat.IntentBuilder.from(MainActivity.this)
        .setType("text/plain")
        .setChooserTitle("Share Text")
        .setText("Hello, just do a test!")
        .startChooser();


如果要Intent也是可以getIntent()取出來
Intent intent =
    ShareCompat.IntentBuilder.from(MainActivity.this)
    .setType("text/plain")
    .setText("Hello, just do a test!")
    .getIntent();

現在取得分享內容

在Activity中加入AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:mimeType="text/plain" />
</intent-filter>

處理分享內容
ShareCompat.IntentReader intentReader =
        ShareCompat.IntentReader.from(MainActivity.this);
if (intentReader.isShareIntent()) {
    Toast.makeText(getApplicationContext(),
            "got share intent@onCreate text:" + intentReader.getText(),
            Toast.LENGTH_LONG).show();
}

現在分享圖片到其他App

Uri uriToImage = 你的從圖片選取器中取的Uri;
Intent intent = ShareCompat.IntentBuilder.from(MainActivity.this)
        .setType(getContentResolver().getType(uriToImage))
        .setStream(uriToImage)
        .getIntent();
intent.setData(uriToImage);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "Share Image"));

setType如果沒有寫,會導致你用IntentReader來接收分享,需要額外多寫一段處理。
這裡的Type是透過ContentResolver幫我們決定,就不用自己寫"image/jpeg", "image/png"之類的。(偷懶XD)

粗體字部份如果沒有寫,在選擇分享到哪個App的時候不會顯示預覽圖。設FLAG的目的是讓分享的App可以直接有權限讀取該Uri。

提供範例

https://github.com/Mirochiu/ShareToApps


其他關於分享


留言