如何分享資訊到App

如何分享資訊到App

有時候你會想要從外部分享資訊到自己的App,
Android內允許你這樣做,
首先到AndroidManifest內, 找到自己的Activity

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
</application>

加上兩個intent-filter,
這樣就可以在Android內看到分享會出現自己的app icon了,

非常的簡單。

那接下來要處理分享進來的文字或影像該怎麼做呢?
一開始先處理分享進來的Intent

public static String sharingIntent(Context context, Intent intent){
    String action = intent.getAction();
    String type = intent.getType();
    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            return handleSendText(intent);
        } else if (type.startsWith("image/")) {
            return handleSendImage(context, intent);
        }
    }
    return "";
}

首先判斷Intent內分享的是文字還是圖片, 再交給個別處理的方法
文字處理比較簡單。

private static String handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        return sharedText;
    }
    return "";
}

如果字串不是null, 則回傳分享進來的字串

處理圖片

private static String handleSendImage(Context context, Intent intent) {
    Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (imageUri != null) {
        if(imageUri.getPath().endsWith(".jpg") || imageUri.getPath().endsWith(".png")){
            return imageUri.getPath();
        }
        return getRealPathFromURI(context, imageUri);
    }
    return "";
}

public static String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

有時候處理圖片會進來是一個URI,
所以必須透過ContentResolver去解析出真正的位置。
而接收的地方會是onCreate,
只需要getIntent就可以拿到傳入的文字或圖片位置了。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String data = SharingIntent.sharingIntent(this, getIntent());
        String type = getIntent().getType();
        if(!TextUtils.isEmpty(data)) {
            if ("text/plain".equals(type)) {
                Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
            } else if (type.startsWith("image/")) {
                Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
            }
        }
    }
}

首先分享一段網址文字

再來分享本地端的圖片

透過URI拿到真正的位置之後, 再將圖片透過Android的方法呈現出來。

github