坑坑洼洼的WebView

最基礎(chǔ)的使用方法

最簡單的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

在Activity中使用WebView:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.loadUrl(baiduUrl);
    }

但只是這樣的話脖隶,在模擬器上是會(huì)直接調(diào)到系統(tǒng)瀏覽器去的锚贱,在手機(jī)上(我用的三星N9002莹菱,5.0系統(tǒng))貌似可以直接加載而且點(diǎn)擊頁面的超鏈接也可以在當(dāng)前頁面完成跳轉(zhuǎn)弊琴。事實(shí)上翘骂, WebView的默認(rèn)行為是將鏈接點(diǎn)擊事件作為 Intent 發(fā)送給系統(tǒng)棋弥,由系統(tǒng)決定如何處理(通常的行為是使用瀏覽器打開或是彈出瀏覽器選擇對(duì)話框)核偿,我猜我用的三星測(cè)試機(jī)的WebView可能被廠商做了一些處理。

所以我們開發(fā)使用webView時(shí)一般都會(huì)給它設(shè)置WebViewClient顽染。

If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url.

    /**
     * Sets the WebViewClient that will receive various notifications and
     * requests. This will replace the current handler.
     *
     * @param client an implementation of WebViewClient
     */
    public void setWebViewClient(WebViewClient client) {
        checkThread();
        mProvider.setWebViewClient(client);
    }

WebViewClient主要幫助WebView處理各種通知宪祥、請(qǐng)求事件的,它的方法有:

shouldOverrideUrlLoading
onPageStarted
onPageFinished
onLoadResource
onReceivedError
……

添加如下一行代碼:

//WebViewClient中的方法大都是空實(shí)現(xiàn)家乘,如果需要處理蝗羊,則寫一個(gè)它的子類傳入即可
webView.setWebViewClient(new WebViewClient());

另外一個(gè)看起來跟WebViewClient很像的類是WebChromeClient,它主要輔助WebView處理Javascript的對(duì)話框仁锯、網(wǎng)站圖標(biāo)耀找、網(wǎng)站title、加載進(jìn)度等,它的方法有:

onProgressChanged
onReceivedTitle
onReceivedIcon
onJsAlert
openFileChooser
……

設(shè)置方法也差不多:

//傳入WebChromeClient或其子類
webView.setWebChromeClient(new WebChromeClient());

運(yùn)行結(jié)果如下:


但會(huì)發(fā)現(xiàn)怎么頁面的百度樣式貌似很老很老野芒,跟瀏覽器加載出來的百度首頁怎么不一樣呢蓄愁。那是因?yàn)槲覀儼俣软撁媸鞘褂昧薐S的,所以我們需要對(duì)WebView設(shè)置JS可執(zhí)行:

webView.getSettings().setJavaScriptEnabled(true);

另外百度新聞的頁面始終只轉(zhuǎn)菊花而加載不出來狞悲,試驗(yàn)發(fā)現(xiàn)需要設(shè)置另外一個(gè)屬性撮抓,使DOM storage API可用:

webView.getSettings().setDomStorageEnabled(true);

這是整個(gè)頁面就跟瀏覽器一致了:


當(dāng)點(diǎn)擊進(jìn)入下一級(jí)頁面如新聞時(shí),發(fā)現(xiàn)點(diǎn)返回鍵就直接退出了桌面摇锋,這里需要我們自己去復(fù)寫當(dāng)前Activity的onKeyDown方法實(shí)現(xiàn)WebView的返回邏輯:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

自定義url

  • shouldOverrideUrlLoading
    我的項(xiàng)目中為了使從WebView中點(diǎn)擊特定鏈接(比如我們的自定義鏈接:yxy://abc?id=1)可以跳轉(zhuǎn)到一個(gè)指定的native頁面丹拯,需要進(jìn)行特殊處理,這個(gè)需求就可以使用shouldOverrideUrlLoading方法來實(shí)現(xiàn)荸恕。
    /**
     * Give the host application a chance to take over the control when a new
     * url is about to be loaded in the current WebView. If WebViewClient is not
     * provided, by default WebView will ask Activity Manager to choose the
     * proper handler for the url. If WebViewClient is provided, return true
     * means the host application handles the url, while return false means the
     * current WebView handles the url.
     * This method is not called for requests using the POST "method".
     *
     * @param view The WebView that is initiating the callback.
     * @param url The url to be loaded.
     * @return True if the host application wants to leave the current WebView
     *         and handle the url itself, otherwise return false.
     */
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }

從代碼注釋中可以看出這個(gè)方法的作用是乖酬,當(dāng)一個(gè)新的url將要在當(dāng)前webView中加載時(shí),給當(dāng)前應(yīng)用程序一個(gè)機(jī)會(huì)融求,去決定如何處理咬像。有三種情況:

  1. 當(dāng)前webView沒有設(shè)置WebViewClient,webView將請(qǐng)求系統(tǒng)去選擇合適的處理程序(比如系統(tǒng)瀏覽器)生宛;
  2. 當(dāng)前webView設(shè)置了WebViewClient:
    a. 如果shouldOverrideUrlLoading返回true县昂,則由應(yīng)用的代碼進(jìn)行處理,webView不處理陷舅;
    b.如果shouldOverrideUrlLoading返回false七芭,則由webView去處理,即webView加載url蔑赘。

上面的第2點(diǎn)的b狸驳,其實(shí)就是shouldOverrideUrlLoading的默認(rèn)實(shí)現(xiàn),我們經(jīng)常見到一些代碼這樣寫:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
}

其實(shí)這樣跟直接return false是一樣的處理效果缩赛。

  • 處理自定義的url
    我在測(cè)試時(shí)發(fā)現(xiàn)一個(gè)問題耙箍,當(dāng)我使用webView加載一個(gè)有效的http鏈接,如:
webView.loadUrl("http://www.baidu.com");

加載時(shí)酥馍,shouldOverrideUrlLoading會(huì)被回調(diào)到辩昆,而如果直接加載一個(gè)無效的自定義鏈接,如:

webView.loadUrl("yxy://abc");

則shouldOverrideUrlLoading不會(huì)被回調(diào)旨袒,webView會(huì)出現(xiàn)一個(gè)錯(cuò)誤提示:


此時(shí)如果直接去點(diǎn)擊頁面中的藍(lán)色鏈接汁针,又會(huì)發(fā)現(xiàn)shouldOverrideUrlLoading被回調(diào)了。通過Google砚尽,發(fā)現(xiàn)官方有一篇文章(Migrating to WebView in Android 4.4)專門提到這一點(diǎn)施无,從Android 4.4開始,WebView有了一些新的特性必孤,有點(diǎn)方面也跟以前不同了猾骡,在處理用戶自定義的url時(shí),校驗(yàn)貌似更嚴(yán)格了:

The new WebView applies additional restrictions when requesting resources and resolving links that use a custom URL scheme. For example, if you implement callbacks such as shouldOverrideUrlLoading() or shouldInterceptRequest(), then WebView invokes them only for valid URLs.
If you are using a custom URL scheme or a base URL and notice that your app is receiving fewer calls to these callbacks or failing to load resources on Android 4.4, ensure that the requests specify valid URLs that conform to RFC 3986.

當(dāng)shouldOverrideUrlLoading被回調(diào)時(shí),可以通過下面的方式來實(shí)現(xiàn)應(yīng)用自己的處理:

// The URL scheme should be non-hierarchical (no trailing slashes)
private static final String APP_SCHEME = "example-app:";
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith(APP_SCHEME)) {
       urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8"); 
       respondToData(urlData); 
       return true;
    } 
    return false;
}
  • 通過Linkify兴想,在TextView中生成超鏈接
    (……)

WebView中Java和JS交互

我的項(xiàng)目中是使用了這個(gè)開源項(xiàng)目幢哨,非常好用——https://github.com/lzyzsd/JsBridge

自定義UA

項(xiàng)目中為了方便web端統(tǒng)計(jì)分析,我們需要在WebView的UserAgent中加入app的特定標(biāo)識(shí):

// 獲取當(dāng)前WebView的UA
String ua = webView.getSettings().getUserAgentString();
// 在當(dāng)前UA字符串的末尾增加app的標(biāo)識(shí)和版本號(hào)等信息
webView.getSettings().setUserAgent(ua + " APP_TAG/5.0.1");

輸入法設(shè)置

為了避免WebView中彈出鍵盤遮擋住光標(biāo)嫂便,需要在對(duì)應(yīng)的Activity中增加如下配置:

android:windowSoftInputMode="stateHidden|adjustResize"

集成騰訊瀏覽服務(wù)TBS

TBS的官網(wǎng):http://x5.tencent.com/index
在使用Android的WebView時(shí)捞镰,遇到過很多問題。比如支持html頁面內(nèi)點(diǎn)擊按鈕打開本地圖片上傳到服務(wù)器這個(gè)需求毙替,Android各個(gè)版本W(wǎng)ebView的api都不同岸售,而且更奇葩的是有的手機(jī)竟然完全不支持這個(gè)功能,原因竟然是Android在WebView版本迭代時(shí)造成的歷史遺留bug蔚龙。諸如此類大坑小坑還是挺多的,碎片化太嚴(yán)重映胁。(可以看看知乎這個(gè)提問:http://www.zhihu.com/question/31316646?sort=created

目前移動(dòng)端系統(tǒng)內(nèi)置瀏覽器的常見內(nèi)核有 Webkit木羹,Blink,Trident解孙,Gecko 等坑填,其中 iPhone 和 iPad 等蘋果 iOS 平臺(tái)主要是 WebKit,Windows Phone 8 系統(tǒng)瀏覽器內(nèi)核是 Trident弛姜,Android 4.4 之前的 Android 系統(tǒng)瀏覽器內(nèi)核是 WebKit脐瑰,Android4.4 系統(tǒng)瀏覽器切換到了Chromium,內(nèi)核是 Webkit 的分支 Blink廷臼。所以Android4.4之前與之后存在一些WebView的兼容問題苍在。

提到兼容問題,我們肯定會(huì)想到一些三方的SDK可以完美地解決這些問題荠商。所以去年時(shí)我們項(xiàng)目嘗試接入騰訊的X5(TBS的官網(wǎng))寂恬。當(dāng)時(shí)X5還是1.x的版本,集成后發(fā)現(xiàn)很不好用莱没,因?yàn)樗且蚕砦⑿呕蛘呤諵的內(nèi)核初肉,但是app啟動(dòng)后老是加載不到X5內(nèi)核,自己去調(diào)系統(tǒng)內(nèi)核了饰躲,10次只有1牙咏、2次能調(diào)用到X5內(nèi)核,SDK提供的demo也一樣有問題嘹裂,而且文檔很簡陋妄壶,很多地方寫得不清楚,論壇提問題也沒人解決寄狼,所以只好放棄了盯拱。今年聽說X5發(fā)布了2.x的版本,功能也相對(duì)穩(wěn)定了,所以現(xiàn)在再次嘗試狡逢。

下載SDK宁舰,發(fā)現(xiàn)有兩種:

第一種說明了只共享微信或者手Q的內(nèi)核,那就是說如果用戶手機(jī)上沒有微信和手Q奢浑,就不能使用X5內(nèi)核了蛮艰,雖然現(xiàn)在基本每臺(tái)手機(jī)都有微信或手Q,但還是自帶X5內(nèi)核比較好雀彼,而且下載了兩個(gè)skd對(duì)比壤蚜,發(fā)現(xiàn)只是jar包大小上的區(qū)別。

開始集成了徊哑!
1.把SDK解壓后袜刷,找出里面的jar包導(dǎo)入到工程,我使用的AS莺丑,所以直接粘貼到lib包下面:


2.根據(jù)集成文檔著蟹,把項(xiàng)目中所有用到的WebView及其相關(guān)的類都替換為“com.tencent.smtt”包下同名的類:


必須要替換完全了,包括java代碼和xml中使用到的地方梢莽,否則會(huì)發(fā)生錯(cuò)誤萧豆;

3.如果使用的是“Android SDK(With download)”的SDK,即我們現(xiàn)在使用的可獨(dú)立下載X5內(nèi)核的SDK昏名,則需要使用下面代碼允許第三方app下載X5內(nèi)核:

QbSdk.allowThirdPartyAppDownload(true);

因?yàn)槲臋n中強(qiáng)調(diào)這句代碼要在創(chuàng)建WebView之前調(diào)用涮雷,xml中的WebView會(huì)再執(zhí)行Activity中的代碼之前被創(chuàng)建,所以我覺得最好將這句代碼放在Application中轻局。

4.加入必要的權(quán)限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

我將文章開頭講到的測(cè)試代碼中WebView相關(guān)的類替換為SDK提供的同名類并加入第3點(diǎn)的代碼后洪鸭,運(yùn)行代碼,WebView正常加載仑扑,那么如何判斷使使用了X5內(nèi)核呢卿嘲,有一個(gè)小技巧,就是長按文字夫壁,喚出復(fù)制菜單:


使用系統(tǒng)內(nèi)核時(shí)WebView的復(fù)制樣式

使用X5內(nèi)核時(shí)WebView的復(fù)制樣式

如果復(fù)制的樣式改變了拾枣,則說明X5內(nèi)核啟動(dòng)了。當(dāng)我多實(shí)驗(yàn)了幾次后盒让,發(fā)現(xiàn)并不一定每次app一打開梅肤,X5內(nèi)核就會(huì)加載成功,可能是下載X5內(nèi)核的工作不一定可以立馬完成吧邑茄,有時(shí)還要等一段時(shí)間多啟動(dòng)幾次才加載上X5的內(nèi)核姨蝴。但比1.x的SDK感覺要好很多,至少?zèng)]出現(xiàn)一直加載不出X5內(nèi)核的情況肺缕。

【首次加載即能使用X5內(nèi)核的方法】
原來官方在這里有解決方案:http://x5.tencent.com/doc?id=1002_1
真心建議X5的接入文檔能夠更詳細(xì)更完善一點(diǎn)左医,否則很多地方接入時(shí)真得很費(fèi)勁授帕,要來回看各個(gè)角落里的信息才能解決一些基礎(chǔ)問題,論壇上也有很多遺留問題其實(shí)可以集中放在文檔中的浮梢。
如何首次啟動(dòng)WebView就能加載到X5內(nèi)核呢跛十,SDK中其實(shí)直接提供了對(duì)應(yīng)的API,只需要在Application中加上下面的代碼就可以了:

public class MainApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        QbSdk.initX5Environment(this, QbSdk.WebviewInitType.FIRSTUSE_AND_PRELOAD, new QbSdk.PreInitCallback() {
            @Override
            public void onCoreInitFinished() {
                Log.d("MainApplication", "x5 core load success");
            }

            @Override
            public void onViewInitFinished(boolean b) {

            }
        });
    }
}

initX5Environment 內(nèi)部會(huì)創(chuàng)建一個(gè)線程向后臺(tái)查詢當(dāng)前可用內(nèi)核版本號(hào)秕硝,這個(gè)函數(shù)內(nèi)是異步執(zhí)行所以不會(huì)阻塞 App 主線程芥映,這個(gè)函數(shù)內(nèi)是輕量級(jí)執(zhí)行所以對(duì) App 啟動(dòng)性能沒有影響,當(dāng) App 后續(xù)創(chuàng)建 webview 時(shí)就可以首次加載 x5 內(nèi)核了远豺。首界面就使用tbs webview的奈偏,因?yàn)?initX5Environment 需要做初始化操作,不適用首次加載 x5的方案躯护。

雖然是預(yù)加載惊来,如果在沒有加載完成前就啟動(dòng)了含有WebView的界面,還是會(huì)有一點(diǎn)卡頓棺滞。

5.API使用的調(diào)整

  • 在使用WebView時(shí)裁蚁,我們獲取它的寬度是使用:
webView.getWidth();

但因?yàn)镾DK所提供的WebView類,是對(duì)系統(tǒng)WebView的聚合包裝检眯,所以獲取寬度時(shí)需要用:

webView.getView().getWidth();
  • 調(diào)整cookie的使用

com.tencent.smtt.sdk.CookieManager和com.tencent.smtt.sdk.CookieSyncManager的相關(guān)接口的調(diào)用厘擂,在接入SDK后昆淡,需要放到創(chuàng)建X5的WebView之后(也就是X5內(nèi)核加載完成)進(jìn)行锰瘸;否則,cookie的相關(guān)操作只能影響系統(tǒng)內(nèi)核昂灵。

6.獲取異常上報(bào)信息
可將以下API返回的信息攜帶進(jìn)異常上報(bào)的附加信息里

WebView.getTbsCoreVersion(); // 返回內(nèi)核版本信息
WebView.getTbsSDKVersion(); // 返回瀏覽器SDK版本信息
WebView.getCrashExtraMessage; // 返回crash線索信息

7.兼容視頻播放

  • 享受頁面視頻的完整播放體驗(yàn)需要在WebView所在的Activity中增加下面的聲明:
android:configChanges="orientation|screenSize|keyboardHidden"

加上之后避凝,就支持了視屏播放的橫豎屏切換和全屏非全屏的切換。

  • 視頻為了避免閃屏和透明問題眨补,需要如下設(shè)置:
    • 網(wǎng)頁中的視頻管削,上屏幕的時(shí)候,可能出現(xiàn)閃爍的情況撑螺,需要如下設(shè)置:Activity在onCreate時(shí)需要設(shè)置:
getWindow().setFormat(PixelFormat.TRANSLUCENT);  //這個(gè)對(duì)宿主沒什么影響含思,建議聲明
  • 在非硬繪手機(jī)和聲明需要controller的網(wǎng)頁上,視頻切換全屏和全屏切換回頁面內(nèi)會(huì)出現(xiàn)視頻窗口透明問題甘晤,需要如下設(shè)置:
聲明當(dāng)前Activiy的<item name="android:windowIsTranslucent">false為不透明含潘。
特別說明:這個(gè)視各app情況所需,不強(qiáng)制需求线婚,如果聲明了遏弱,對(duì)體驗(yàn)更有利
  • 以下接口禁止(直接或反射)調(diào)用,避免視頻畫面無法顯示:
webview.setLayerType()
webview.setDrawingCacheEnabled(true);

X5對(duì)視頻的兼容很不錯(cuò)塞弊,在使用原生WebView時(shí)漱逸,播放視頻的效果是下面這樣:


樣式丑泪姨,全屏和橫屏的效果也很不好。使用X5內(nèi)核的WebView時(shí)饰抒,播放視頻效果如下:


播放進(jìn)度肮砾、功能按鈕等的樣式美觀了,而且橫屏和全屏的支持也很贊循集,還可以鎖定屏幕和調(diào)整畫面比例唇敞,唯一美中不足的是有廣告:


8.混淆
TBS jar 已經(jīng)混淆過,所以 App 混淆時(shí)可以不再混淆咒彤。也可以添加集成文檔中給出的混淆策略疆柔。

9.接入TBS視頻播放器

TBS不僅提供了強(qiáng)大的網(wǎng)頁瀏覽功能,更提供了強(qiáng)大的頁面H5視頻播放支持镶柱,播放器同時(shí)支持頁面旷档,小窗,全屏播放體驗(yàn)歇拆,強(qiáng)大的解碼能力鞋屈,包括mp4,rmvb故觅,flv厂庇,avi等26種視頻格式支持。
TBS播放器的播放場景不僅局限于H5頁面播放输吏,也可以接入一般的視頻流鏈接权旷,比如本地文件,網(wǎng)絡(luò)的視頻流鏈接贯溅。開發(fā)者如果想播放一個(gè)視頻鏈接拄氯,在不自己開發(fā)播放器的前提下,一般做法是將視頻的播放鏈接放到一個(gè)Intent里面它浅,拋給系統(tǒng)的播放器進(jìn)行播放译柏,那么當(dāng)你集成了TBS后,你只需要通過簡單的方式接入視頻播放調(diào)用接口姐霍,這樣你不需要寫任何一句關(guān)于播放器的代碼鄙麦,就可以享受一個(gè)本地播放器體驗(yàn),播放視頻再不需要Intent來跨App镊折、跨進(jìn)程的調(diào)用了胯府。

  • 在AndroidManifest中注冊(cè)VideoActivity
        <activity
            android:name="com.tencent.smtt.sdk.VideoActivity"
            android:alwaysRetainTaskState="true"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:exported="false"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="com.tencent.smtt.tbs.video.PLAY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
  • 調(diào)用播放視頻的接口

//判斷當(dāng)前Tbs播放器是否已經(jīng)可以使用。
public static boolean canUseTbsPlayer(Context context)
//直接調(diào)用播放接口腌乡,傳入視頻流的url
public static void openVideo(Context context, String videoUrl)
//extraData對(duì)象是根據(jù)定制需要傳入約定的信息盟劫,沒有需要可以傳null
public static void openVideo(Context context, String videoUrl, Bundle extraData)

直接調(diào)用以上接口,就可以打開VideoActivity播放傳入url對(duì)應(yīng)的視頻与纽,相當(dāng)于集成了一個(gè)內(nèi)部播放器侣签,非常方便:

TbsVideo.openVideo(context, "http://www.huixuedu.com/uploads/media/151201/1-151201112136.mp4");

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塘装,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子影所,更是在濱河造成了極大的恐慌蹦肴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猴娩,死亡現(xiàn)場離奇詭異阴幌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卷中,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門矛双,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蟆豫,你說我怎么就攤上這事议忽。” “怎么了十减?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵栈幸,是天一觀的道長。 經(jīng)常有香客問我帮辟,道長速址,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任由驹,我火速辦了婚禮芍锚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荔棉。我一直安慰自己闹炉,他們只是感情好蒿赢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布润樱。 她就那樣靜靜地躺著,像睡著了一般羡棵。 火紅的嫁衣襯著肌膚如雪壹若。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天皂冰,我揣著相機(jī)與錄音店展,去河邊找鬼。 笑死秃流,一個(gè)胖子當(dāng)著我的面吹牛赂蕴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舶胀,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼概说,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼碧注!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糖赔,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤萍丐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后放典,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝变,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年奋构,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壳影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弥臼,死狀恐怖态贤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情醋火,我是刑警寧澤悠汽,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站芥驳,受9級(jí)特大地震影響柿冲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兆旬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一假抄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丽猬,春花似錦宿饱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至由桌,卻和暖如春为黎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背行您。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工铭乾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娃循。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓炕檩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捌斧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笛质,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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