Android 微信分享成功后回調問題


如何讓我們的App接收到微信的反饋?

1. 在你的包名相應目錄下新建一個wxapi目錄,並在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自Activity,並在manifest文件里面加上exported屬性,設置為true,允許該Activity被其他應用調用,這句話很重要。

        <activity
                android:name="你的APP包名.wxapi.WXEntryActivity"
                android:launchMode="singleTop"
                android:exported="true"
                android:theme="@style/comment_activity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="sdksample"/>
            </intent-filter>
        </activity>

 

2. 實現IWXAPIEventHandler接口,微信發送的請求將回調到onReq方法,發送到微信請求的響應結果將回調到onResp方法。

3. 在WXEntryActivity中將接收到的intent及實現了IWXAPIEventHandler接口的對象傳遞給IWXAPI接口的handleIntent方法。當微信發送請求到你的應用,將通過IWXAPIEventHandler接口的onReq方法進行回調,類似的,應用請求微信的響應結果將通過onResp回調。

其中,必須要新建WXEntryActivity類,實現IWXAPIEventHandler接口,同時該文件必須在${yourAppPackageName}.wxapi包下,回調才有作用

 

    在程序中我們並不需要自己主動的去啟動WXEntryActivity,只需要把回調后的邏輯處理代碼在onResq()這個回調接口中實現,處理完邏輯后將該Activity finish()掉就可以了. 

    在WXEntryActivity中一定要參考官方的文檔,實現onNewIntent(Intent intent)方法,這個方法為微信客戶端分享成功后回調我們應用中的WXEntryActivity類,通過newintent(Intent intent)來啟動WXEntryActivity類,並在newIntent方法中通過IWXAPI接口中的handleIntent方法,注冊監聽

 

下面普及newIntent()方法的解釋: 

Android onNewIntent的應用

onCreate是用來創建一個Activity也就是創建一個窗體,但一個Activty處於任務棧的頂端,若再次調用startActivity去創建它,則不會再次創建。若你想利用已有的Acivity去處理別的Intent時,你就可以利用onNewIntent來處理。在onNewIntent里面就會獲得新的Intent.

如果IntentActivity處於任務棧的頂端,也就是說之前打開過的Activity,現在處於onPause onStop狀態的話,其他應用再發送Intent的話,執行順序為:
onNewIntent -> onRestart -> onStart -> onResume

onNewIntent(Intent intent) 是Activity類的方法.它被調用發幾種情況如下:

  1.  android:launchMode="singleTask" 配置在 Mainifest 中,它保證了棧中此Activity總是只有一個,無論你啟動它多少次;Activiy配置成android:launchMode="singleTask" ,在點Home鍵退出Activity而再次啟動新的Intent進來時onNewIntent(Intent intent) 方法會被調用到; 

  2. 利用已有的Acivity去處理別的Intent時,你就可以利用onNewIntent來處理,通常被用在有搜索請求的activity,而其該activity有好幾個intent-filter,該方法被調用的前提:
    a、該activity設置如下屬性 android:launchMode="singleTop"。
    b、該activity已經處在棧的頂端,通過其他的方法又重新啟動該acitvity時被調用,如搜索,這時oncreate()方法不調用。  

 

看完onnewIntent()方法的介紹后,大家應該明白一點了,我們就是將WXEntryActivity設置成singleTop了。

 

示例代碼:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private static CreditManager.KGainCreditType gainCreditType;
    private static long dataShareId;
    private IWXAPI api;
 
    public static void setTypeAndDataShareId(CreditManager.KGainCreditType type, long srcId) {
        gainCreditType = type;
        dataShareId = srcId;
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wx_entry_activity);
        initData();
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        initData();
    }
 
    private void initData() {
        api = OpenUtils.instance().getIWXAPI();
        api.handleIntent(getIntent(), this);
    }
 
    @Override
    public void onReq(BaseReq req) {
    }
 
    @Override
    public void onResp(BaseResp resp) {
        String result = null;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK: {
                CreditManager creditManager = ShuiDi.instance().getCreditManager();
                creditManager.submitGainCreditEventToServer(gainCreditType, dataShareId);
                result = "分享成功";
            }
            break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "分享取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "分享被拒絕";
                break;
            default:
                result = "分享返回";
                break;
        }
 
        Toast.makeText(this, result, Toast.LENGTH_LONG).show();
        this.finish();
    }
}

 

 

  1 public class EntryActivity extends Activity implements IWXAPIEventHandler {
  2 
  3     @Override
  4     public void onCreate(Bundle savedInstanceState) {
  5         super.onCreate(savedInstanceState);
  6 
  7         if (Wechat.instance.getWxAPI() == null) {
  8             startMainActivity();
  9         } else {
 10             Wechat.instance.getWxAPI().handleIntent(getIntent(), this);
 11         }
 12     }
 13 
 14     @Override
 15     protected void onNewIntent(Intent intent) {
 16         super.onNewIntent(intent);
 17 
 18         setIntent(intent);
 19 
 20         if (Wechat.instance.getWxAPI() == null) {
 21             startMainActivity();
 22         } else {
 23             Wechat.instance.getWxAPI().handleIntent(intent, this);
 24         }
 25     }
 26 
 27     @Override
 28     public void onResp(BaseResp resp) {
 29         XYMLogUtil.d(Wechat.TAG, resp.toString());
 30 
 31         if (Wechat.instance.getCurrentCallbackContext() == null) {
 32             startMainActivity();
 33             return ;
 34         }
 35 
 36         switch (resp.errCode) {
 37             case BaseResp.ErrCode.ERR_OK:
 38                 switch (resp.getType()) {
 39                     case ConstantsAPI.COMMAND_SENDAUTH:
 40                         auth(resp);
 41                         break;
 42 
 43                     case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: // 分享給好友、朋友圈
 44                     case ConstantsAPI.COMMAND_PAY_BY_WX:
 45                     default:
 46                         Wechat.instance.getCurrentCallbackContext().success();
 47                         break;
 48                 }
 49                 break;
 50             case BaseResp.ErrCode.ERR_USER_CANCEL:
 51                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_USER_CANCEL);
 52                 break;
 53             case BaseResp.ErrCode.ERR_AUTH_DENIED:
 54                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_AUTH_DENIED);
 55                 break;
 56             case BaseResp.ErrCode.ERR_SENT_FAILED:
 57                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_SENT_FAILED);
 58                 break;
 59             case BaseResp.ErrCode.ERR_UNSUPPORT:
 60                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_UNSUPPORT);
 61                 break;
 62             case BaseResp.ErrCode.ERR_COMM:
 63                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_COMMON);
 64                 break;
 65             default:
 66                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_UNKNOWN);
 67                 break;
 68         }
 69 
 70         finish();
 71     }
 72 
 73     @Override
 74     public void onReq(BaseReq req) {
 75         finish();
 76     }
 77 
 78     protected void startMainActivity() {
 79         Intent intent = new Intent();
 80         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 81         intent.setPackage(getApplicationContext().getPackageName());
 82         getApplicationContext().startActivity(intent);
 83     }
 84 
 85     protected void auth(BaseResp resp) {
 86         SendAuth.Resp res = ((SendAuth.Resp) resp);
 87 
 88         XYMLogUtil.d(Wechat.TAG, res.toString());
 89 
 90         JSONObject response = new JSONObject();
 91         try {
 92             response.put("code", res.code);
 93             response.put("state", res.state);
 94             response.put("country", res.country);
 95             response.put("lang", res.lang);
 96         } catch (JSONException e) {
 97             XYMLogUtil.e(Wechat.TAG, e.getMessage());
 98         }
 99 
100         Wechat.instance.getCurrentCallbackContext().success(response);
101     }
102 }
項目實戰代碼

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM