有時候你會想要從外部分享資訊到自己的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的方法呈現出來。