Android系统相册图片分享到自己应用内部

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

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

发布了30 篇原创文章 · 获赞 7 · 访问量 7030
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章