android桌面角標(biāo)調(diào)研和代碼實(shí)現(xiàn)

android 桌面角標(biāo)能力

小米

測(cè)試結(jié)果:支持角標(biāo)能力捆憎,最大值為9(官方數(shù)據(jù))侮邀, (實(shí)測(cè)可以到note4 顯示為9999...mix2s 顯示為99999....)

條件:需要向狀態(tài)欄發(fā)送一條通知,進(jìn)入APP則角標(biāo)消失撩满,抹除通知?jiǎng)t角標(biāo)也消失 习蓬,在端內(nèi)時(shí)不顯示

首先打開應(yīng)用通知設(shè)置頁(yè)面攒霹,在”設(shè)置-通知管理“里點(diǎn)擊應(yīng)用忧陪,查看”顯示桌面圖標(biāo)角標(biāo)“開關(guān)是否開啟扣泊。大部分應(yīng)用默認(rèn)是關(guān)閉狀態(tài)。

資料:

https://dev.mi.com/console/doc/detail?pId=939

https://dev.mi.com/console/doc/detail?pId=2321

華為(榮耀)

測(cè)試結(jié)果:支持角標(biāo)能力

條件 EMUI4.1 及以上及以上手機(jī) 打開通知和角標(biāo) 選擇顯示為數(shù)字角標(biāo)

最多顯示99 超過99顯示為99+

官網(wǎng)資料需要添加 華為權(quán)限 (實(shí)測(cè)不加也能顯示) 代碼需要try處理 避免無角標(biāo)能力導(dǎo)致崩潰

<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>

資料:

https://developer.huawei.com/consumer/cn/doc/development/Corner-Guides/30802

OPPO

結(jié)論:需要上架嘶摊,并且向oppo申請(qǐng)功能,還有適配才有评矩。

資料:https://open.oppomobile.com/bbs/forum.php?mod=viewthread&tid=1711

VIVO

結(jié)論:需要向VIVO申請(qǐng)接入“桌面圖標(biāo)角標(biāo)”叶堆,但是官方?jīng)]放開

image-20210601163058274.png

資料:https://dev.vivo.com.cn/documentCenter/doc/459

三星

結(jié)論:(網(wǎng)上資料)三星S9+ 以上 需和通知的方式結(jié)合才能顯示角標(biāo),

三星 Galaxy S6 :可直接設(shè)置斥杜。設(shè)置為0 則角標(biāo)消失

顯示數(shù)量上限不限 虱颗,暫無其他三星手機(jī)進(jìn)行測(cè)試。

魅族

結(jié)論:官方不支持

總結(jié)

華為 小米 三星 部分原生系統(tǒng) 可以支持蔗喂。 oppo vivo 魅族 暫時(shí)不支持

代碼編寫

小米角標(biāo)代碼

這里簡(jiǎn)單備注一下忘渔,小米在進(jìn)入app內(nèi)的時(shí)候,角標(biāo)消息會(huì)清除缰儿。所以在處理小米的時(shí)候畦粮,在應(yīng)用在后臺(tái)的時(shí)候 應(yīng)該再次將角標(biāo)顯示出來。

/**
 * @param markNumber 顯示數(shù)量
 *                   顯示小米角標(biāo)
 *                   小米官網(wǎng) 角標(biāo)代碼
 *                   https://dev.mi.com/console/doc/detail?pId=2321
 *                   https://dev.mi.com/console/doc/detail?pId=939
 *                   顯示小米角標(biāo)數(shù)量
 */
private void showXiaoMiDeskMark(int markNumber) {
    try {
        markNumber = detectMarkNumber(markNumber);
        //因?yàn)樾∶赘聰?shù)量需要發(fā)送通知 當(dāng)是0的 時(shí)候就沒必要進(jìn)行發(fā)送了
        if (markNumber == 0) {
            return;
        }
        NotificationManager notificationManager = getNotificationManager();
        if (notificationManager == null) {
            return;
        }
        // 通知8.0
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(XIAOMI, XIAOMI_CHANLE_NAME, NotificationManager.IMPORTANCE_DEFAULT);
            channel.setShowBadge(true);
            notificationManager.createNotificationChannel(channel);
        }
        Intent intent = new Intent(getContext(), HomeActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 0, intent, 0);
        Notification notification = new NotificationCompat.Builder(getContext(), XIAOMI)
                .setContentTitle("棉花糖消息")
                .setContentText("您有" + markNumber + "條IM未讀消息")
                .setLargeIcon(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon))
                .setSmallIcon(R.drawable.icon)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setChannelId(XIAOMI)
                .setNumber(markNumber)
                .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL).build();

        //小米角標(biāo)代碼
        Field field = notification.getClass().getDeclaredField("extraNotification");
        Object extraNotification = field.get(notification);
        Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
        method.invoke(extraNotification, markNumber);
        notificationManager.notify(NOTIFY_ID, notification);
    } catch (Exception e) {
        e.printStackTrace();
        XLog.e("showXiaoMiDeskMark is Error");
    }

}
華為角標(biāo)代碼
/**
 * @param number 顯示角標(biāo)數(shù)量 0 則隱藏
 *               顯示華為角標(biāo)
 */
private void showHuaWeiDeskMark(int number) {
    try {
        number = detectMarkNumber(number);
        Bundle extra = new Bundle();
        extra.putString("package", getContext().getPackageName());
        extra.putString("class", getLauncherClassName());
        extra.putInt("badgenumber", number);
        getContext().getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra);
    } catch (Exception ignored) {
        ignored.printStackTrace();
        XLog.e("showHuaWeiDeskMark is Error");
    }

}
三星代碼
/**
 * @param markCount 角標(biāo)值
 *                  顯示三星角標(biāo)
 */
private void showSamsungDeskMark(int markCount) {
    try {
        String launcherClassName = getLauncherClassName();
        Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        intent.putExtra("badge_count", markCount);
        intent.putExtra("badge_count_package_name", getContext().getPackageName());
        intent.putExtra("badge_count_class_name", launcherClassName);
        getContext().sendBroadcast(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
限定最大值99
/**
 * @param markNumber 要顯示的角標(biāo)數(shù)量
 * @return 最大99 最小0
 */
private int detectMarkNumber(int markNumber) {
    if (markNumber < 0) {
        markNumber = 0;
    } else if (markNumber > MARK_MAX_COUNT) {
        markNumber = MARK_MAX_COUNT;
    }
    return markNumber;
}

通知的加入(TPNS)

端內(nèi)使用的是TPNS,也就是原來的信鴿,這部分代碼不具備通用性宣赔。如果你也使用的是TPNS可以進(jìn)行參考预麸。

通知的增加和刪減

經(jīng)測(cè)試,小米在收到通知的時(shí)候儒将,在tpns下角標(biāo)會(huì)自動(dòng)增加1吏祸,通知抹除的時(shí)候 會(huì)自動(dòng)扣除1。

華為(榮耀)在通知到來時(shí)钩蚊,角標(biāo)不會(huì)增加贡翘,但是通知?jiǎng)h除的時(shí)候則會(huì)減去1.如果 在通知?jiǎng)h除的時(shí)候 進(jìn)行角標(biāo)設(shè)置。則可能會(huì)發(fā)生砰逻,刪除一個(gè)扣2個(gè)的可能性床估。則這里進(jìn)行一個(gè)延遲操作∮詹常基本可以解決這個(gè)問題丐巫。如果有其他好的方法請(qǐng)留言。

代碼相關(guān)

TPNS里面消息的接收在XGPushBaseReceiver 類里勺美,繼承XGPushBaseReceiver递胧,

onNotificationShowedResult --消息到來展現(xiàn)

onNotificationClickedResult --消息劃掉或者點(diǎn)擊回調(diào)

我選擇封裝一個(gè)觀察者進(jìn)行處理

public class DeskNoticeObservable extends Observable {
    private NoticeDeskReceiver noticeDeskReceiver;

    /**
     * 是否注冊(cè)
     */
    private boolean isRegister;

    public void init(AppCompatActivity appCompatActivity) {
        if (appCompatActivity == null) {
            return;
        }
        //監(jiān)聽下消息
        if (noticeDeskReceiver == null) {
            noticeDeskReceiver = new NoticeDeskReceiver() {
                //tpns消息到來
                @Override
                public void onNotificationShowedResult(Context context, XGPushShowedResult xgPushShowedResult) {
                    super.onNotificationShowedResult(context, xgPushShowedResult);
                    notifyNoticeCount(1);

                }

                //tpns消息點(diǎn)擊和消除
                @Override
                public void onNotificationClickedResult(Context context, XGPushClickedResult xgPushClickedResult) {
                    super.onNotificationClickedResult(context, xgPushClickedResult);
                    notifyNoticeCount(-1);
                }
            };
        }

        IntentFilter intentFilter = getIntentFilter();
        //添加消息監(jiān)聽
        appCompatActivity.getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> {
            if (event == Lifecycle.Event.ON_CREATE) {
                try {
                    appCompatActivity.registerReceiver(noticeDeskReceiver, intentFilter);
                    isRegister = true;
                } catch (Exception e) {
                    XLog.e("registerReceiver:  isError");
                }

            } else if (event == Lifecycle.Event.ON_DESTROY) {
                if (noticeDeskReceiver != null) {
                    if (!isRegister) {
                        return;
                    }
                    try {
                        //反注銷
                        appCompatActivity.unregisterReceiver(noticeDeskReceiver);
                        isRegister = false;
                        //剔除掉所有觀察者
                        DeskNoticeObservable.this.deleteObservers();
                    } catch (Exception exception) {
                        XLog.e("unregisterReceiver:  isError");
                    }

                }

            }
        });
    }

    /**
     * @param number 通知消息變更
     */
    private void notifyNoticeCount(int number) {
        setChanged();
        notifyObservers(number);
    }

    /**
     * @return 返回Filter
     * 添加對(duì)于消息監(jiān)聽
     */
    @NotNull
    private IntentFilter getIntentFilter() {
        IntentFilter intentFilter = new IntentFilter();
        //添加過濾的Action值;
        intentFilter.addAction("com.tencent.android.xg.vip.action.PUSH_MESSAGE");
        intentFilter.addAction("com.tencent.android.xg.vip.action.FEEDBACK");
        return intentFilter;
    }
}
public class NoticeDeskReceiver extends XGPushBaseReceiver {
//需要覆蓋很多方法 這里就不寫出來了
}

全部代碼

通知接收器
public class NoticeDeskReceiver extends XGPushBaseReceiver {

}
通知觀察者
/**
 * 通知角標(biāo) 觀察者
 */
public class DeskNoticeObservable extends Observable {
    private NoticeDeskReceiver noticeDeskReceiver;

    /**
     * 是否注冊(cè)
     */
    private boolean isRegister;

    public void init(AppCompatActivity appCompatActivity) {
        if (appCompatActivity == null) {
            return;
        }
        //監(jiān)聽下消息
        if (noticeDeskReceiver == null) {
            noticeDeskReceiver = new NoticeDeskReceiver() {
                //tpns消息到來
                @Override
                public void onNotificationShowedResult(Context context, XGPushShowedResult xgPushShowedResult) {
                    super.onNotificationShowedResult(context, xgPushShowedResult);
                    notifyNoticeCount(1);

                }

                //tpns消息點(diǎn)擊和消除
                @Override
                public void onNotificationClickedResult(Context context, XGPushClickedResult xgPushClickedResult) {
                    super.onNotificationClickedResult(context, xgPushClickedResult);
                    notifyNoticeCount(-1);
                }
            };
        }

        IntentFilter intentFilter = getIntentFilter();
        //添加消息監(jiān)聽
        appCompatActivity.getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> {
            if (event == Lifecycle.Event.ON_CREATE) {
                try {
                    appCompatActivity.registerReceiver(noticeDeskReceiver, intentFilter);
                    isRegister = true;
                } catch (Exception e) {
                    XLog.e("registerReceiver:  isError");
                }

            } else if (event == Lifecycle.Event.ON_DESTROY) {
                if (noticeDeskReceiver != null) {
                    if (!isRegister) {
                        return;
                    }
                    try {
                        //反注銷
                        appCompatActivity.unregisterReceiver(noticeDeskReceiver);
                        isRegister = false;
                        //剔除掉所有觀察者
                        DeskNoticeObservable.this.deleteObservers();
                    } catch (Exception exception) {
                        XLog.e("unregisterReceiver:  isError");
                    }

                }

            }
        });
    }

    /**
     * @param number 通知消息變更
     */
    private void notifyNoticeCount(int number) {
        setChanged();
        notifyObservers(number);
    }

    /**
     * @return 返回Filter
     * 添加對(duì)于消息監(jiān)聽
     */
    @NotNull
    private IntentFilter getIntentFilter() {
        IntentFilter intentFilter = new IntentFilter();
        //添加過濾的Action值赡茸;
        intentFilter.addAction("com.tencent.android.xg.vip.action.PUSH_MESSAGE");
        intentFilter.addAction("com.tencent.android.xg.vip.action.FEEDBACK");
        return intentFilter;
    }

角標(biāo)管理者
/**
 * 桌面角標(biāo)
 */
public class DesktopCornerMark {
    private static final String TAG = "DesktopCornerMark";
    /**
     * 限定最大顯示99條
     */
    private static final int MARK_MAX_COUNT = 99;

    /**
     * 通知id
     */
    private static final int NOTIFY_ID = 999533;

    /**
     * 小米發(fā)通知用的id
     */
    private static final String XIAOMI = "xiaomi";
    /**
     * 小米通知渠道
     */
    private static final String XIAOMI_CHANLE_NAME = "xiaomi_chanle";
    /**
     * 默認(rèn)啟動(dòng)頁(yè)面名稱
     */
    private static final String SPLASH_CLASS_NAME = "com.wobo.live.launch.SplashActivity";
    /**
     * 是否在前臺(tái) 默認(rèn)在前臺(tái)
     */
    private boolean isInFrontDesk = true;
    /**
     * 默認(rèn)緩存的角標(biāo)數(shù)量
     */
    private int imMarkCount = 0;
    /**
     * 通知數(shù)量
     */
    private int noticeMarkCount = 0;

    /**
     * @param number 顯示角標(biāo)數(shù)量 0 則隱藏
     *               顯示華為角標(biāo)
     */
    private void showHuaWeiDeskMark(int number) {
        try {
            number = detectMarkNumber(number);
            Bundle extra = new Bundle();
            extra.putString("package", getContext().getPackageName());
            extra.putString("class", getLauncherClassName());
            extra.putInt("badgenumber", number);
            getContext().getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra);
        } catch (Exception ignored) {
            ignored.printStackTrace();
            XLog.e("showHuaWeiDeskMark is Error");
        }

    }


    /**
     * @param markNumber 顯示數(shù)量
     *                   顯示小米角標(biāo)
     *                   小米官網(wǎng) 角標(biāo)代碼
     *                   https://dev.mi.com/console/doc/detail?pId=2321
     *                   https://dev.mi.com/console/doc/detail?pId=939
     *                   顯示小米角標(biāo)數(shù)量
     */
    private void showXiaoMiDeskMark(int markNumber) {
        try {
            markNumber = detectMarkNumber(markNumber);
            //因?yàn)樾∶赘聰?shù)量需要發(fā)送通知 當(dāng)是0的 時(shí)候就沒必要進(jìn)行發(fā)送了
            if (markNumber == 0) {
                return;
            }
            NotificationManager notificationManager = getNotificationManager();
            if (notificationManager == null) {
                return;
            }
            // 通知8.0
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(XIAOMI, XIAOMI_CHANLE_NAME, NotificationManager.IMPORTANCE_DEFAULT);
                channel.setShowBadge(true);
                notificationManager.createNotificationChannel(channel);
            }
            Intent intent = new Intent(getContext(), HomeActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 0, intent, 0);
            Notification notification = new NotificationCompat.Builder(getContext(), XIAOMI)
                    .setContentTitle("消息提醒")
                    .setContentText("您有" + markNumber + "條IM未讀消息")
                    .setLargeIcon(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon))
                    .setSmallIcon(R.drawable.icon)
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setChannelId(XIAOMI)
                    .setNumber(markNumber)
                    .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL).build();

            //小米角標(biāo)代碼
            Field field = notification.getClass().getDeclaredField("extraNotification");
            Object extraNotification = field.get(notification);
            Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
            method.invoke(extraNotification, markNumber);
            notificationManager.notify(NOTIFY_ID, notification);
        } catch (Exception e) {
            e.printStackTrace();
            XLog.e("showXiaoMiDeskMark is Error");
        }


    }

    /**
     * @return 通知是否打開
     */
    private boolean notificationIsOpen() {
        return NotificationManagerCompat.from(VLApplication.instance()).areNotificationsEnabled();
    }

    /**
     * @return 是否支持角標(biāo)能力
     * 目前調(diào)研只有 華為 小米能夠支持 Xiaomi  HUAWEI
     * 三星只進(jìn)行了s6測(cè)試 需要測(cè)試進(jìn)行跟進(jìn)
     */
    private boolean isSupportDeskMark() {
        return isHuaWei() || isXiaoMi() || isSamsung();
    }

    /**
     * @return 獲取手機(jī)廠商
     * Xiaomi  HUAWEI samsung
     */
    private static String getPhoneMode() {
        return android.os.Build.MANUFACTURER;
    }

    /**
     * @return 獲取啟動(dòng)頁(yè)name
     */
    private String getLauncherClassName() {
        ComponentName launchComponent = getLauncherComponentName();
        if (launchComponent == null) {
            return SPLASH_CLASS_NAME;
        } else {
            return launchComponent.getClassName();
        }
    }

    private ComponentName getLauncherComponentName() {
        Intent launchIntent = getContext().getPackageManager().getLaunchIntentForPackage(getContext()
                .getPackageName());
        if (launchIntent != null) {
            return launchIntent.getComponent();
        } else {
            return null;
        }
    }

    /**
     * @param markNumber 要顯示的角標(biāo)數(shù)量
     * @return 最大99 最小0
     */
    private int detectMarkNumber(int markNumber) {
        if (markNumber < 0) {
            markNumber = 0;
        } else if (markNumber > MARK_MAX_COUNT) {
            markNumber = MARK_MAX_COUNT;
        }
        return markNumber;
    }

    /**
     * 初始化
     */
    public void init(AppCompatActivity appCompatActivity) {
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() {
            @Override
            public void onPause(@NonNull LifecycleOwner owner) {
                //在后臺(tái)
                isInFrontDesk = false;
                showDeskMark();
            }

            @Override
            public void onResume(@NonNull LifecycleOwner owner) {
                //在前臺(tái) 小米在前臺(tái)的時(shí)候 會(huì)清掉數(shù)據(jù) 華為做同樣處理
                isInFrontDesk = true;
                if (isXiaoMi()) {
                    cancelNotice();
                }

            }
        });
        //添加通知 如果不需要屏蔽掉就行了
        registerNotice(appCompatActivity);

    }

    /**
     * @return 是否是小米
     */
    private boolean isXiaoMi() {
        return "xiaomi".equals(getPhoneMode().toLowerCase());
    }

    /**
     * @return 是否是華為
     */
    private boolean isHuaWei() {
        return "huawei".equals(getPhoneMode().toLowerCase());
    }

    /**
     * @return 是否是三星
     */
    private boolean isSamsung() {
        return "samsung".equals(getPhoneMode().toLowerCase());
    }

    /**
     * @return 上下文
     */
    private Context getContext() {
        return VLApplication.instance();
    }

    public void showDeskMark(int markNumber) {

        //不是華為 不是小米 直接返回
        if (!isSupportDeskMark() || !notificationIsOpen()) {
            return;
        }

        imMarkCount = markNumber;
        //在前臺(tái)就不更改角標(biāo) 直到在后臺(tái)為止
        if (isInFrontDesk) {
            return;
        } else {
            showDeskMark();
        }
    }

    /**
     * 顯示角標(biāo)數(shù)量
     */
    private void showDeskMark() {

        int markNumber = imMarkCount + noticeMarkCount;
        if (markNumber < 0) {
            markNumber = 0;
        }
        int finalMarkNumber = markNumber;
        //延遲600毫秒執(zhí)行
        io.reactivex.Observable.timer(600, TimeUnit.MILLISECONDS).safeSubscribe(new V3Observer<Long>() {
            @Override
            public void onSuccess(Long aLong) {
                //華為
                if (isHuaWei()) {
                    showHuaWeiDeskMark(finalMarkNumber);
                } else if (isXiaoMi()) {
                    //小米  小米在通知的時(shí)候 會(huì)自己加1減1 只處理im消息通知的數(shù)量
                    showXiaoMiDeskMark(imMarkCount);
                } else if (isSamsung()) {
                    //三星
                    showSamsungDeskMark(finalMarkNumber);
                }
            }
        });

    }

    /**
     * @return 獲取通知管理者
     */
    private NotificationManager getNotificationManager() {
        return (NotificationManager) VLApplication.instance().getSystemService
                (Context.NOTIFICATION_SERVICE);

    }

    /**
     * @param markCount 角標(biāo)值
     *                  顯示三星角標(biāo)
     */
    private void showSamsungDeskMark(int markCount) {
        try {
            String launcherClassName = getLauncherClassName();
            Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
            intent.putExtra("badge_count", markCount);
            intent.putExtra("badge_count_package_name", getContext().getPackageName());
            intent.putExtra("badge_count_class_name", launcherClassName);
            getContext().sendBroadcast(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 取消通知
     */
    private void cancelNotice() {
        NotificationManager notificationManager = getNotificationManager();
        if (notificationManager != null) {
            notificationManager.cancel(NOTIFY_ID);
        }
    }

    /**
     * @param appCompatActivity activity頁(yè)面
     *                          注冊(cè)通知監(jiān)聽
     */
    private void registerNotice(AppCompatActivity appCompatActivity) {
        DeskNoticeObservable deskNoticeObservable = new DeskNoticeObservable();
        deskNoticeObservable.addObserver((o, arg) -> {
            int noticeCountChange = (int) arg;
            //強(qiáng)轉(zhuǎn)為int 類型 并更新當(dāng)前通知的數(shù)量
            noticeMarkCount = noticeMarkCount + noticeCountChange;
            //避免出現(xiàn)負(fù)數(shù)
            if (noticeMarkCount < 0) {
                noticeMarkCount = 0;
            }
            //顯示角標(biāo)
            showDeskMark();
        });
        //初始化
        deskNoticeObservable.init(appCompatActivity);

    }


}

代碼使用 可以參考
https://github.com/nuonuoOkami/DesktopCornerMark

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缎脾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子占卧,更是在濱河造成了極大的恐慌遗菠,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件华蜒,死亡現(xiàn)場(chǎng)離奇詭異辙纬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叭喜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門贺拣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捂蕴,你說我怎么就攤上這事譬涡。” “怎么了啥辨?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵涡匀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我溉知,道長(zhǎng)陨瘩,這世上最難降的妖魔是什么腕够? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮拾酝,結(jié)果婚禮上燕少,老公的妹妹穿的比我還像新娘。我一直安慰自己蒿囤,他們只是感情好客们,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著材诽,像睡著了一般底挫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脸侥,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天建邓,我揣著相機(jī)與錄音,去河邊找鬼睁枕。 笑死官边,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的外遇。 我是一名探鬼主播注簿,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼跳仿!你這毒婦竟也來了诡渴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菲语,失蹤者是張志新(化名)和其女友劉穎妄辩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體山上,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眼耀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胶哲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔塔。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸯屿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情把敢,我是刑警寧澤寄摆,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站修赞,受9級(jí)特大地震影響婶恼,放射性物質(zhì)發(fā)生泄漏桑阶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一勾邦、第九天 我趴在偏房一處隱蔽的房頂上張望蚣录。 院中可真熱鬧,春花似錦眷篇、人聲如沸萎河。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虐杯。三九已至,卻和暖如春昧港,著一層夾襖步出監(jiān)牢的瞬間擎椰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工创肥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留达舒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓叹侄,卻偏偏與公主長(zhǎng)得像巩搏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圈膏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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