最近公司項目集成了融雲,需求是系統相冊圖片或者截圖,分享列表中有自己應用,並且可以分享到融雲用戶。
1.首先在目標頁面的mainfast.xml之中設置
<activity
android:name=".im.activity.ContactListActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="這個是在main設置的action"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<!--以下配置是在目標頁面中配置,可以實現分享列表出現自己應用-->
<!--本次主要介紹圖片類的分享,其他文件同樣步驟-->
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/jpeg"/>
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/png"/>
</intent-filter>
</activity>
2.在目標接收頁面做接收處理
/**
* 外部分享的文件
*/
private void getShareImageUri() {
Intent itnIn = getIntent();
Bundle extras = itnIn.getExtras();
String action = itnIn.getAction();
if (Intent.ACTION_SEND.equals(action)) {
if (extras.containsKey(Intent.EXTRA_STREAM)) {
try {
Uri imageUri = extras.getParcelable(Intent.EXTRA_STREAM);
// 返回路徑
imsgeUrl = UriUtil.getRealPathFromURI(ContactListActivity.this, imageUri);
Bundle bun = new Bundle();
bun.putString("Type", imsgeUrl);
LoginInterceptor.interceptor(this, "這個是在main設置的action", bun);
} catch (Exception e) {
LogUtil.e(e.toString());
}
}
}
// else if (extras != null) {
// if (extras.containsKey("Type")) {
// imsgeUrl = extras.getString("Type");
// isSysImageShare = true;
// mTitleBarTv.setText("發送給朋友");
// }
// }
}
3.其實功能已經可以實現了,但是突然發現要考慮到賬號是否登陸的情況,就有上面47 48 49 56-62行代碼。這用到了登陸攔截,參考的鏈接
public class LoginInterceptor {
public static final String mINVOKER = "INTERCEPTOR_INVOKER";
/**
* 判斷處理
*
* @param ctx 當前activity的上下文
* @param target 目標activity的target
* @param bundle 目標activity所需要的參數
* @param intent 目標activity
*/
public static void interceptor(Context ctx, String target, Bundle bundle, Intent intent) {
if (target != null && target.length() > 0) {
LoginCarrier invoker = new LoginCarrier(target, bundle);
if (getLogin(ctx)) {
invoker.invoke(ctx);
} else {
if (intent == null) {
intent = new Intent(ctx, LoginActivity.class);
}
login(ctx, invoker, intent);
}
} else {
Toast.makeText(ctx, "沒有activity可以跳轉", Toast.LENGTH_SHORT).show();
}
}
/**
* 登錄判斷
*
* @param ctx 當前activity的上下文
* @param target 目標activity的target
* @param bundle 目標activity所需要的參數
*/
public static void interceptor(Context ctx, String target, Bundle bundle) {
interceptor(ctx, target, bundle, null);
}
// 這裏獲取登錄狀態,具體獲取方法看項目具體的判斷方法
private static boolean getLogin(Context context) {
//這裏做是否登陸的判斷 已經登陸返回true 沒有登陸返回false
return false;
}
private static void login(Context context, LoginCarrier invoker, Intent intent) {
intent.putExtra(mINVOKER, invoker);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
}
這個就是實體類
public class LoginCarrier implements Parcelable {
public String mTargetAction;
public Bundle mbundle;
public LoginCarrier(String target, Bundle bundle) {
mTargetAction = target;
mbundle = bundle;
}
/**
* 目標activity
*
* @param ctx
*/
public void invoke(Context ctx) {
Intent intent = new Intent(mTargetAction);
if (mbundle != null) {
intent.putExtras(mbundle);
}
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
}
public LoginCarrier(Parcel parcel) {
// 按變量定義的順序讀取
mTargetAction = parcel.readString();
mbundle = parcel.readParcelable(Bundle.class.getClassLoader());
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
// 按變量定義的順序寫入
parcel.writeString(mTargetAction);
parcel.writeParcelable(mbundle, flags);
}
public static final Parcelable.Creator<LoginCarrier> CREATOR = new Parcelable.Creator<LoginCarrier>() {
@Override
public LoginCarrier createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new LoginCarrier(source);
}
@Override
public LoginCarrier[] newArray(int arg0) {
// TODO Auto-generated method stub
return new LoginCarrier[arg0];
}
};
}
同時記得在登錄頁設置
if (invoker != null) {
invoker.invoke(LoginActivity.this);
} else {
if (getIntent() != null) {
invoker = getIntent().getParcelableExtra(LoginInterceptor.mINVOKER);
if (invoker != null) {
invoker.invoke(LoginActivity.this);
}
}
}
<!--記得第二次在onNewIntent()方法裏面接收值-->
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
invoker = (LoginCarrier) intent.getParcelableExtra(LoginInterceptor.mINVOKER);
}
在目標頁的onNewIntent()方法中也是第二次獲取的時候取值
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {
Bundle extras = intent.getExtras();
if (extras.containsKey("Type")) {
imsgeUrl = extras.getString("Type");
//要刷新頁面
getData();
}
}
}
參考:
https://blog.csdn.net/qq_34983989/article/details/78438254
https://blog.csdn.net/xiaochouwangzi188/article/details/49768969