Android 微信炊汹,QQ琐馆,新浪三方登錄及分享官方SDK集成

集成過程中踩了不少坑小作,我會盡量寫的詳細一點。

微信


關(guān)于開發(fā)平臺申請appID即纲,appSecret,下載SDK等步驟不表博肋。

  • 環(huán)境配置
    libammsdk.jar導(dǎo)入lib低斋,androidManifest中添加基本權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

接收微信的回調(diào)消息如分享是否成功,登錄授權(quán)等信息是否拿到匪凡,需要注冊一個Activity膊畴,這個Activity必須建立在包名下的wxapi文件夾中。
比如項目包名為com.android.test,需要在包名下新建一個wxapi的文件夾病游,并在其中新建WXEntryActivity類唇跨,實現(xiàn)IWXAPIEventHandler接口。
注意類名必須為WXEntryActivity衬衬。androidManifest中:

<activity 
    android:name=".wxapi.WXEntryActivity" 
    android:exported="true">
</activity>

WXEntryActivity 中:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化api并向微信注冊應(yīng)用买猖。
        api = WXAPIFactory.createWXAPI(this, APP_ID);
        api.registerApp(APP_ID);
        api.handleIntent(getIntent(), this);
    }
    
    // 微信發(fā)送請求到第三方應(yīng)用時,會回調(diào)到該方法
    @Override
    public void onReq(BaseReq baseReq) {

    }
    
    // 第三方應(yīng)用發(fā)送到微信的請求處理后的響應(yīng)結(jié)果滋尉,會回調(diào)到該方法
    @Override
    public void onResp(BaseResp baseResp) {
         switch (baseResp.errCode) {
             case BaseResp.ErrCode.ERR_OK:
                //如果集成了分享和登錄功能玉控,那么可以通過baseResp.getType()來判斷是哪個回調(diào)信息,1為登錄授權(quán)兼砖,2為分享
                //如果是登錄授權(quán)奸远,那么調(diào)用了登錄api以后,這里會返回獲取accessToken需要的code
                 SendAuth.Resp sendResp = (SendAuth.Resp) baseResp;
                 String code = sendResp.code;
                 
                break;
             case BaseResp.ErrCode.ERR_SENT_FAILED:  
                break;
             case BaseResp.ErrCode.ERR_USER_CANCEL: 
                break;
         }
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
       super.onNewIntent(intent);
       //如果分享的時候讽挟,該已經(jīng)開啟懒叛,那么微信開始這個activity時,會調(diào)用onNewIntent耽梅,所以這里要處理微信的返回結(jié)果
       setIntent(intent);
       api.handleIntent(intent, this);
    }
    
    public void getAccessToken(String code, String secret) {
        //微信登錄時薛窥,需要通過code請求url獲取accesstoken。
         String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                        "appid=" + APP_ID +
                        "&secret=" + secret +
                        "&code=" + code +
                        "&grant_type=authorization_code";
         //以下是網(wǎng)絡(luò)請求拿到accesstoken以及openid.
            ...
    }
    
    public void getUserInfo(String accessToken, String openId) {
        //如果獲取到了AccessToken和openid眼姐,請求url獲取用戶信息
         String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" +
                        accessToken + "&openid=" + openId;
          ...              
    }
    
}
  • 微信分享及登錄
    我新建了WeChatManager類诅迷,在其中做了不同類型的分享及登錄。
public class WeChatManager {
    private Context mContext;
    private IWXAPI wxapi;
    private static WeChatManager mInstance;
    private static final int THUMB_SIZE = 150;
    public static final int WECHAT_SHARE_WAY_TEXT = 1;   //文字
    public static final int WECHAT_SHARE_WAY_PICTURE = 2; //圖片
    public static final int WECHAT_SHARE_WAY_WEBPAGE = 3;  //鏈接
    public static final int WECHAT_SHARE_WAY_VIDEO = 4; //視頻
    public static final int WECHAT_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession;  //會話
    public static final int WECHAT_SHARE_TYPE_FRIENDS = SendMessageToWX.Req.WXSceneTimeline; //朋友圈
    private ShareContent mShareContentText, mShareContentPicture, mShareContentWebpag, mShareContentVideo; 
   
    public WeChatManager(Context context) {
    
          this.mContext = context;
          initWxApi();
    }
    
    private void initWxApi() {
         wxapi = WXAPIFactory.createWXAPI(mContext, APP_ID, true);
         wxapi.registerApp(APP_ID);
    }
    
     /**
     * 通過微信分享
     *
     * @param shareContent 分享的方式(文本众旗、圖片罢杉、鏈接)
     * @param shareType    分享的類型(朋友圈,會話)
     */
     public void shareByWebchat(ShareContent shareContent, int shareType) {
        switch (shareContent.getShareWay()) {
            case WECHAT_SHARE_WAY_TEXT:
                shareText(shareContent, shareType);
                break;
            case WECHAT_SHARE_WAY_PICTURE:
                sharePicture(shareContent, shareType);
                break;
            case WECHAT_SHARE_WAY_WEBPAGE:
                shareWebPage(shareContent, shareType);
                break;
            case WECHAT_SHARE_WAY_VIDEO:
                shareVideo(shareContent, shareType);
                break;
        }
     }
      private abstract class ShareContent {
         protected abstract int getShareWay();
 
         protected abstract String getContent();
 
         protected abstract String getTitle();
 
         protected abstract String getURL();
 
         protected abstract byte[] getPictureResource();
     }
      /**
      * 設(shè)置分享鏈接的內(nèi)容
      *
      * @author chengcj1
      */
     public class ShareContentWebpage extends ShareContent {
         private String title;
         private String content;
         private String url;
         private byte[] pictureResource;
 
         public ShareContentWebpage(String title, String content, String url, byte[] pictureResource) {
             this.title = title;
             this.content = content;
             this.url = url;
             this.pictureResource = pictureResource;
         }
 
         @Override
         protected int getShareWay() {
             return WECHAT_SHARE_WAY_WEBPAGE;
         }
 
         @Override
         protected String getContent() {
             return content;
         }
 
         @Override
         protected String getTitle() {
             return title;
         }
 
         @Override
         protected String getURL() {
             return url;
         }
 
         @Override
         protected byte[] getPictureResource() {
             return pictureResource;
         }
     }
 
     /*
      * 獲取網(wǎng)頁分享對象
      */
     public ShareContent getShareContentWebpag(String title, String content, String url, byte[] pictureResource) {
         if (mShareContentWebpag == null) {
             mShareContentWebpag = new ShareContentWebpage(title, content, url, pictureResource);
         }
         return (ShareContentWebpage) mShareContentWebpag;
     }
     
      /*
      * 分享鏈接
      */
     private void shareWebPage(ShareContent shareContent, int shareType) {
         WXWebpageObject webpage = new WXWebpageObject();
         webpage.webpageUrl = shareContent.getURL();
         WXMediaMessage msg = new WXMediaMessage(webpage);
         msg.title = shareContent.getTitle();
         msg.description = shareContent.getTitle();
 
         if(shareContent.getPictureResource() != null) {
             msg.thumbData = shareContent.getPictureResource();
 
      
         }
         else {
             Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher);
             Bitmap thumbBitmap = Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true);
             thumb.recycle();
             msg.thumbData = bitmapToByteArray(thumbBitmap);
         }
         SendMessageToWX.Req req = new SendMessageToWX.Req();
         req.transaction = buildTransaction("webpage");
         req.message = msg;
         req.scene = shareType;
         wxapi.sendReq(req);
     }

     
}

這里我建議分享的圖片類型贡歧,如果是工程中的圖片滩租,就用int赋秀,如果需要是網(wǎng)上下載下來的,或者本地圖冊獲取到的律想,就用byte[]猎莲,這里我在下面說明原因。
關(guān)于不同類型的分享技即,應(yīng)該傳遞什么必要參數(shù)著洼,我建議在文檔中找一找。在做鏈接分享的時候而叼,我要上傳的圖片是從服務(wù)器下載下載的身笤,之前是將圖片類型設(shè)置為bitmap傳入的。
但是常會出現(xiàn)圖片大小超過32K的情況(規(guī)定鏈接分享上傳的圖片大小不能超過32K)澈歉,如果需要用bitmap傳入展鸡,這里可以用采樣率壓縮圖片。
壓縮圖片有質(zhì)量壓縮和采樣率壓縮埃难,質(zhì)量壓縮即:

 public byte[] compressBmp(Bitmap bitmap){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int options = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        while (baos.toByteArray().length  > 32768 && options!= 10) {
            baos.reset();
            options -= 10;
            bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
        }
        return baos.toByteArray();
    }

質(zhì)量壓縮能改變File或者stream流的大小莹弊,方便上傳服務(wù)器等操作,但是像素是沒有改變的涡尘,也就是說轉(zhuǎn)變成bitmap以后的大小還是和以前一樣忍弛。
如有需要可以去查查更詳細的質(zhì)量壓縮的資料。
那么bitmap改變不了大小考抄,傳給wxapi的圖片還是超過限制细疚,就需要采樣率壓縮,或者叫做尺寸壓縮川梅。我們將流中的圖片利用BitmapFactory轉(zhuǎn)成bitmap時疯兼,設(shè)置
options.inJustDecodeBounds = true,這樣將只會讀取圖片邊框贫途,不會將數(shù)據(jù)讀入內(nèi)存吧彪,然后計算長寬比,設(shè)置options.inSampleSize = be
采樣率壓縮會使圖片失真丢早。

  /**  以上是質(zhì)量壓縮姨裸,不會減少圖片的像素,但是BitmapFactory.decode到內(nèi)存中像素和大小仍然沒有變  **/
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap newBitmap = BitmapFactory.decodeStream(bis, null, options);
    options.inJustDecodeBounds = false ;
    int w = options.outWidth;
    int h = options.outHeight;
    //我們設(shè)置為微信的占位圖的分辨率
    float ww = THUMB_SIZE;
    float hh = THUMB_SIZE;
    int be = 1; //縮放比怨酝,1表示不縮放
    if(w > h && w > ww){
        be = (int)(options.outWidth*1.0f / ww) + 1;
    }
    else if(h > w && h > hh){
        be = (int)(options.outHeight*1.0f / hh) + 1;
    }
    if(be <= 0)
        be = 1;
    options.inSampleSize = be;

    bis = new ByteArrayInputStream(bos.toByteArray());
    newBitmap = BitmapFactory.decodeStream(bis, null, options);

登錄就相對簡單了:

    public void loginWX(){
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo"; //授權(quán)域傀缩,snsapi_userinfo 表示獲取用戶個人信息
        req.state = "wechat_sdk_demo_test";
        wxapi.sendReq(req);
    }

剩下的步驟在WXEntryActivity中實現(xiàn)。

QQ


如果客戶端沒有QQ农猬,那么Android是不能直接進行QQ網(wǎng)頁授權(quán)登錄的赡艰!

如果客戶端沒有QQ,那么Android是不能直接進行QQ網(wǎng)頁授權(quán)登錄的斤葱!

如果客戶端沒有QQ瞄摊,那么Android是不能直接進行QQ網(wǎng)頁授權(quán)登錄的勋又!

說三遍,因為官方文檔上寫了可以换帜!(坑),而且你用騰訊提供的測試appid也是能網(wǎng)頁授權(quán)的鹤啡,但是換到自己的就不行惯驼,因為騰訊就已經(jīng)不提供網(wǎng)頁授權(quán)的方式了。
當(dāng)然递瑰,如有需要祟牲,可以寫前端代碼,用js橋獲取到前端拿到的用戶數(shù)據(jù)抖部。

我從官方下載的jar包為mta-sdk-1.6.2.jar说贝,open_sdk_r5756.jar
androidmanifest中配置基本權(quán)限慎颗,聲明類:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- SDK2.1新增獲取用戶位置信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.GET_TASKS"/>
<activity
    android:name="com.tencent.tauth.AuthActivity"
    android:launchMode="singleTask"
    android:noHistory="true" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        
        <!-- 這地方的222222需要用你在開放平臺申請的appid替換 -->
        <data android:scheme="tencent222222" />
    </intent-filter>
</activity>

<activity
    android:name="com.tencent.connect.common.AssistActivity"
    android:configChanges="orientation|keyboardHidden"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

在分享類里面乡恕,我們先初始化Tencent類

    private void initQQApi() {
       mTencent = Tencent.createInstance(QQ_APP_ID, getApplicationContext());
       mListener = new ShareQQListener();
       initDialog();
    }

其中mListener實現(xiàn)了IUiListener,主要接受QQ的回調(diào)消息,包括分享的和登錄的俯萎。

/**
 * @desc QQ分享回調(diào)類
 */
class ShareQQListener implements IUiListener {
    @Override
    public void onComplete(Object o) {
        //TODO  同樣都有QQ登錄和分享的回調(diào)傲宜,這個可以分開寫。
        //QQ登錄先初始化openId 和 Token
        initOpenidAndToken((JSONObject) o);
        //再獲取用戶信息
        getUserInfo();

    }

    @Override
    public void onError(UiError uiError) {
        finish();
    }

    @Override
    public void onCancel() {
        hideDialog();
        finish();
    }
}

當(dāng)然要接收到QQ的回調(diào)消息夫啊,還需要在onActivityResult添加一些代碼:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (mListener == null)
            mListener = new ShareQQListener();
        if (requestCode == Constants.REQUEST_LOGIN ||
                requestCode == Constants.REQUEST_APPBAR) {
            Tencent.onActivityResultData(requestCode, resultCode, data, mListener);
        }
    }

分享分好友和空間函卒,默認好友,params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN)就可以分享空間撇眯。

 public void shareToQQFriends() {
        final Bundle params = new Bundle();
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的標(biāo)題");
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq.com/news/1.html");
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif");
        mTencent.shareToQQ(QQShareActivity.this, params, mListener);

    }

登錄授權(quán)更簡單:

 public void loginQQ() {
        String SCOPE = "all"; //授權(quán)域
        if (!mTencent.isSessionValid()) {
            mTencent.login(this, SCOPE, mListener);
        }
    }

同樣的报嵌,我們也要在回調(diào)消息里面拿到openid和accessToken,才能獲取到用戶信息

 private void initOpenidAndToken(JSONObject jsonObject) {
    try {
        String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
        String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
        String openid = jsonObject.getString(Constants.PARAM_OPEN_ID);
        if (token != null && expires != null && openid != null)
            if (!token.isEmpty() && !expires.isEmpty() && !openid.isEmpty()) {
                mTencent.setAccessToken(token, expires);
                mTencent.setOpenId(openid);
                userId = openid;
            }

    } catch (JSONException e) {
        e.printStackTrace();
    }
 }
    public void getUserInfo() {
        if (mTencent != null && mTencent.isSessionValid()) {
            UserInfo userInfo = new UserInfo(QQShareActivity.this, mTencent.getQQToken());
            userInfo.getUserInfo(new IUiListener() {
                @Override
                public void onComplete(Object o) {
                    Log.v(TAG, o.toString());
                    //TODO 
                    hideDialog();
                    finish();
                }
    
                @Override
                public void onError(UiError uiError) {
                    hideDialog();
                    finish();
                }
    
                @Override
                public void onCancel() {
                    hideDialog();
                    finish();
                }
            });
        }
    }

微博


我下載的新浪微博的SDK是weiboSDKCore_3.1.4.jar
注意微博的SDK包里面有個lib文件夾熊榛,里面所有文件夾和.so庫文件都要拷到工程中去

配置androidmanifest

    <activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
            android:configChanges="keyboardHidden|orientation"
            android:windowSoftInputMode="adjustResize"
            android:exported="false" >
    </activity>
    <service android:name="com.sina.weibo.sdk.net.DownloadService"
        android:exported="false">
    </service>

添加DownloadService這個service的時候會報紅锚国,提示找不到這個類。是不影響運行的来候。

做分享的類中要加過濾器:

    <activity
        android:name="xxx.xxx.xxx">
        <intent-filter>
            <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
  • 初始化微博api:
 public void initSinaApi(Bundle savedInstanceState){
    mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, WEIBO_APP_KEY);
    mWeiboShareAPI.registerApp();
    // 當(dāng) Activity 被重新初始化時(該 Activity 處于后臺時跷叉,可能會由于內(nèi)存不足被殺掉了),
    // 需要調(diào)用 {@link IWeiboShareAPI#handleWeiboResponse} 來接收微博客戶端返回的數(shù)據(jù)营搅。
    // 執(zhí)行成功云挟,返回 true,并調(diào)用 {@link IWeiboHandler.Response#onResponse}转质;
    // 失敗返回 false园欣,不調(diào)用上述回調(diào)
    if (savedInstanceState != null) {
        mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
    }
   
}
  • 分享的類實現(xiàn)IWeiboHandler.Response接口,接收回調(diào)信息
 @Override
    public void onResponse(BaseResponse baseResponse) {
        if(baseResponse != null){
            switch (baseResponse.errCode){
                case WBConstants.ErrorCode.ERR_OK :
                    
                    finish();
                    break;
                case WBConstants.ErrorCode.ERR_CANCEL :
                    
                    finish();
                    break;
                case WBConstants.ErrorCode.ERR_FAIL :
                    
                   
                    finish();
                    break;
            }
        }
    }
  • 同樣需要在onNewIntent中添加一些代碼
 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        mWeiboShareAPI.handleWeiboResponse(intent,this);
    }
  • 對于微博分享有mWeiShareAPI這種SSO授權(quán)的方式休蟹,分享的時候調(diào)用非常簡單:
    WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
    //文字
    TextObject textObject = new TextObject();
    textObject.text = content;
    weiboMessage.textObject = textObject;

    //圖片
    ImageObject imageObject = new ImageObject();
    imageObject.setImageObject(bm);
    weiboMessage.mediaObject = imageObject;

    //發(fā)送
    SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
    request.transaction = String.valueOf(System.currentTimeMillis());
    request.multiMessage = weiboMessage;
    mWeiboShareAPI.sendRequest(this, request);

但是如果手機上沒有微博客戶端沸枯,是沒法進行SSO授權(quán)并分享的日矫,所以我用all in one的模式。

    public void sendShareRequest(String content,Bitmap bm){
        WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
        //文字
        TextObject textObject = new TextObject();
        textObject.text = content;
        weiboMessage.textObject = textObject;

        //圖片
        ImageObject imageObject = new ImageObject();
        imageObject.setImageObject(bm);
        weiboMessage.mediaObject = imageObject;
        // 2. 初始化從第三方到微博的消息請求
        SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
        // 用transaction唯一標(biāo)識一個請求
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.multiMessage = weiboMessage;


        AuthInfo authInfo = new AuthInfo(this, Config.WEIBO_APPKEY, Config.WEIBO_REDIRECT_URL, Config.WEIBO_SCOPE);
        Oauth2AccessToken accessToken = AccessTokenKeeper.readAccessToken(getApplicationContext());
        String token = "";
        if (accessToken != null) {
            token = accessToken.getToken();
        }
        mWeiboShareAPI.sendRequest(this, request, authInfo, token, new WeiboAuthListener() {

            @Override
            public void onWeiboException( WeiboException arg0 ) {
            }

            @Override
            public void onComplete( Bundle bundle ) {
                // TODO Auto-generated method stub
                Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle);
                AccessTokenKeeper.writeAccessToken(getApplicationContext(), newToken);
                Toast.makeText(getApplicationContext(), "onAuthorizeComplete token = " + newToken.getToken(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancel() {
            }
        });
    }

剩下的可能注意的點


  • 在開發(fā)平臺申請應(yīng)用的時候會需要簽名绑榴,都會提供一些獲取應(yīng)用簽名的小應(yīng)用哪轿,下下來用就可以了。
  • 如果項目中原來集成過三方的分享如shareSDK翔怎,開發(fā)過程中記得把重復(fù)的監(jiān)聽和聲明都去掉窃诉,不然會都收不到回調(diào)信息。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赤套,一起剝皮案震驚了整個濱河市飘痛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌容握,老刑警劉巖宣脉,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剔氏,居然都是意外死亡塑猖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門介蛉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萌庆,“玉大人,你說我怎么就攤上這事币旧〖眨” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵吹菱,是天一觀的道長巍虫。 經(jīng)常有香客問我,道長鳍刷,這世上最難降的妖魔是什么占遥? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮输瓜,結(jié)果婚禮上瓦胎,老公的妹妹穿的比我還像新娘。我一直安慰自己尤揣,他們只是感情好搔啊,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著北戏,像睡著了一般负芋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗜愈,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天旧蛾,我揣著相機與錄音莽龟,去河邊找鬼。 笑死锨天,一個胖子當(dāng)著我的面吹牛毯盈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绍绘,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼奶镶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陪拘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纤壁,失蹤者是張志新(化名)和其女友劉穎左刽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酌媒,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡欠痴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秒咨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇辽。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雨席,靈堂內(nèi)的尸體忽然破棺而出菩咨,到底是詐尸還是另有隱情,我是刑警寧澤陡厘,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布抽米,位于F島的核電站,受9級特大地震影響糙置,放射性物質(zhì)發(fā)生泄漏云茸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一谤饭、第九天 我趴在偏房一處隱蔽的房頂上張望标捺。 院中可真熱鬧,春花似錦揉抵、人聲如沸亡容。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萍倡。三九已至,卻和暖如春辟汰,著一層夾襖步出監(jiān)牢的瞬間列敲,已是汗流浹背阱佛。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戴而,地道東北人凑术。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像所意,于是被迫代替她去往敵國和親淮逊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容