最近公司项目集成了融云,需求是系统相册图片或者截图,分享列表中有自己应用,并且可以分享到融云用户。
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