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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章