Android的权限处理(一)

权限介绍不错的一个博客https://blog.csdn.net/yvan_z/article/details/54138477

权限种类详细

一.Android 的权限介绍

如果在Android系统中6.0以下的并不需要动态获取,
在Android的6.0系统上有的权限需要动态获取,有的权限不危险不需要动态获取,
但是都需要在AndroidManifest.xml文件中进行配置!

1.动态获取的权限(危险权限,需要在配置文件中配置)

(1)需要动态获取的权限组

    //    摄像头权限
    Manifest.permission_group.CAMERA;
    //    传感器权限
    Manifest.permission_group.SENSORS;
    //   录制音频权限
    Manifest.permission_group.MICROPHONE;
    //   日历权限
    Manifest.permission_group.CALENDAR;
    //    定位权限
    Manifest.permission_group.LOCATION;
    //    存储权限
    Manifest.permission_group.STORAGE;
    //    通讯录权限
    Manifest.permission_group.CONTACTS;
    //    短信权限
    Manifest.permission_group.SMS;
    //    电话权限
    Manifest.permission_group.PHONE;

(2)每个动态权限组中有哪些动态权限

<!--需要手动允许权限——————————————————————————————-->
    <!--电话权限-->
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="android.permission.USE_SIP" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
    <!--通讯录权限-->
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!--日历权限-->
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <!--摄像头权限-->
    <uses-permission android:name="android.permission.CAMERA" />
    <!--传感器权限-->
    <uses-permission android:name="android.permission.BODY_SENSORS" />
    <!--定位权限-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--存储权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--录制音频权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!--短信权限-->
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_CELL_BROADCASTS" />

2.常用权限(需要在配置文件中配置)

 <!--普通权限——————————————————————————————————-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><!-- apk更新权限 -->
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /><!-- 通知栏权限 -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIMAX_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIMAX_STATE" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
    <uses-permission android:name="android.permission.READ_SYNC_STATS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.REORDER_TASKS" />
    <uses-permission
        android:name="android.permission.SET_TIME_ZONE"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.SET_WALLPAPER" />
    <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
    <uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ" />
    <uses-permission android:name="android.permission.TRANSMIT_IR" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

3.权限流程

权限流程图

二.Android 权限

我这里面做的就是一个权限获取权限组的制作。

1.封装一个Permission实体类

import android.Manifest;
public class Permission {
    //一共有九个权限
    public static final int PERMISSION_LENGTH=9;

    //    摄像头权限
    public static final int CODE_CAMERA = 0;
    //    传感器权限
    public static final int CODE_SENSORS = 1;
    //   录制音频权限
    public static final int CODE_MICROPHONE = 2;
    //    日历权限
    public static final int CODE_CALENDAR = 3;
    //    定位权限
    public static final int CODE_LOCATION = 4;
    //    存储权限
    public static final int CODE_STORAGE = 5;
    //    通讯录权限
    public static final int CODE_CONTACTS = 6;
    //    短信权限
    public static final int CODE_SMS = 7;
    //    电话权限
    public static final int CODE_PHONE = 8;

    //    摄像头权限
    public static final String CAMERA = Manifest.permission.CAMERA;
    //    传感器权限
    public static final String BODY_SENSORS = Manifest.permission.BODY_SENSORS;
    //   录制音频权限
    public static final String RECORD_AUDIO = Manifest.permission.RECORD_AUDIO;
    //    日历权限
    public static final String READ_CALENDAR = Manifest.permission.READ_CALENDAR;
    public static final String WRITE_CALENDAR = Manifest.permission.WRITE_CALENDAR;
    //    定位权限
    public static final String ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    public static final String ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    //    存储权限
    public static final String READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
    public static final String WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
    //    通讯录权限
    public static final String READ_CONTACTS = Manifest.permission.READ_CONTACTS;
    public static final String WRITE_CONTACTS = Manifest.permission.WRITE_CONTACTS;
    public static final String GET_ACCOUNTS = Manifest.permission.GET_ACCOUNTS;
    //    短信权限
    public static final String SEND_SMS = Manifest.permission.SEND_SMS;
    public static final String RECEIVE_SMS = Manifest.permission.RECEIVE_SMS;
    public static final String READ_SMS = Manifest.permission.READ_SMS;
    public static final String RECEIVE_WAP_PUSH = Manifest.permission.RECEIVE_WAP_PUSH;
    public static final String RECEIVE_MMS = Manifest.permission.RECEIVE_MMS;
    //    电话权限
    public static final String READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
    public static final String CALL_PHONE = Manifest.permission.CALL_PHONE;
    public static final String READ_CALL_LOG = Manifest.permission.READ_CALL_LOG;
    public static final String WRITE_CALL_LOG = Manifest.permission.WRITE_CALL_LOG;
    public static final String ADD_VOICEMAIL = Manifest.permission.ADD_VOICEMAIL;
    public static final String USE_SIP = Manifest.permission.USE_SIP;
    public static final String PROCESS_OUTGOING_CALLS = Manifest.permission.PROCESS_OUTGOING_CALLS;
    //    权限组
    public static final class Group {

        public static final String[] CAMERA = new String[]{Permission.CAMERA};

        public static final String[] SENSORS = new String[]{Permission.BODY_SENSORS};

        public static final String[] MICROPHONE = new String[]{Permission.RECORD_AUDIO};

        public static final String[] CALENDAR = new String[]{
                Permission.READ_CALENDAR,
                Permission.WRITE_CALENDAR};

        public static final String[] LOCATION = new String[]{
                Permission.ACCESS_FINE_LOCATION,
                Permission.ACCESS_COARSE_LOCATION};

        public static final String[] STORAGE = new String[]{
                Permission.READ_EXTERNAL_STORAGE,
                Permission.WRITE_EXTERNAL_STORAGE};

        public static final String[] CONTACTS = new String[]{
                Permission.READ_CONTACTS,
                Permission.WRITE_CONTACTS,
                Permission.GET_ACCOUNTS};

        public static final String[] SMS = new String[]{
                Permission.SEND_SMS,
                Permission.RECEIVE_SMS,
                Permission.READ_SMS,
                Permission.RECEIVE_WAP_PUSH,
                Permission.RECEIVE_MMS};

        public static final String[] PHONE = new String[]{
                Permission.READ_PHONE_STATE,
                Permission.CALL_PHONE,
                Permission.READ_CALL_LOG,
                Permission.WRITE_CALL_LOG,
                Permission.ADD_VOICEMAIL,
                Permission.USE_SIP,
                Permission.PROCESS_OUTGOING_CALLS};
    }
    //    根据权限code返回相应的权限组
    public static String[] getPermissions(int requestCode){
        switch (requestCode){
            case Permission.CODE_CAMERA:
                return Permission.Group.CAMERA;
            case Permission.CODE_SENSORS:
                return Permission.Group.SENSORS;
            case Permission.CODE_MICROPHONE:
                return Permission.Group.MICROPHONE;
            case Permission.CODE_CALENDAR:
                return Permission.Group.CALENDAR;
            case Permission.CODE_LOCATION:
                return Permission.Group.LOCATION;
            case Permission.CODE_STORAGE:
                return Permission.Group.STORAGE;
            case Permission.CODE_CONTACTS:
                return Permission.Group.CONTACTS;
            case Permission.CODE_SMS:
                return Permission.Group.SMS;
            case Permission.CODE_PHONE:
                return Permission.Group.PHONE;
            default:
                return null;
        }
    }
}

2.制作一个权限帮助类PermissionHelper

(1)检查是否有权限

 /**
     * 检查权限是否授予
     *
     * @param context
     * @param requestPermission 权限名称  eg:Permission.CAMERA
     * @return
     */
    public static int checkSelfPermission(Context context, String requestPermission) {
        //如果是6.0以下的手机,ActivityCompat.checkSelfPermission()会始终等于PERMISSION_GRANTED,
        // 但是,如果用户关闭了你申请的权限,ActivityCompat.checkSelfPermission(),会导致程序崩溃
        //   (java.lang.RuntimeException: Unknown exception code: 1 msg null),
        // 你可以使用try{}catch(){},处理异常,也可以在这个地方,低于23就什么都不做,
        // 个人建议try{}catch(){}单独处理,提示用户开启权限。
        try {
            return ActivityCompat.checkSelfPermission(context, requestPermission);
        } catch (RuntimeException e) {
            Toast.makeText(context, "请开启权限,因为已经被拒绝过,无法动态获取权限!", Toast.LENGTH_SHORT)
                    .show();
            SuperLog.e("请开启权限,因为已经被拒绝过,无法动态获取权限:" + e.getMessage());
        }
        return -1;
    }

(2)循环获取权限组中的权限,查看没有获取的权限和拒绝的权限

/**
     * 循环获取权限
     *
     * @param context
     * @param isShouldRationale true:没获取的权限 , false: 已经拒绝权限 
     * @return
     */
    public static ArrayList<String> getNoGrantedPermission(Context context, int requestCode, boolean isShouldRationale) {
        ArrayList<String> permissions = new ArrayList<>();
        String[] requestPermissions = Permission.getPermissions(requestCode);
        for (int i = 0; i < requestPermissions.length; i++) {
            SuperLog.e(i);
            String requestPermission = requestPermissions[i];
            //TODO checkSelfPermission
            int checkSelfPermission = checkSelfPermission(context, requestPermission);
            SuperLog.e("checkSelfPermission:" + checkSelfPermission);
            if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
                SuperLog.e("Android系统超过6.0需要动态申请权限" + requestPermission + "isShouldRationale:" + isShouldRationale);
                if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, requestPermission)) {
                    SuperLog.e("权限被拒绝过,并且不在提示");
                    if (isShouldRationale) {
                        permissions.add(requestPermission);
                    }
                } else {
                    if (!isShouldRationale) {
                        permissions.add(requestPermission);
                    }
                }
            }
        }

        return permissions;
    }

(3)需要制作一个权限的成功的回调接口

    //回调返回结果
    public interface PermissionGrant {
        void onPermissionGranted(int requestCode);
    }

(4)进行权限申请的方法

 /**
     * 申请权限组
     */
    public static void requestGroupPermission(final Context context, int requestCode, PermissionGrant grant) {      
        //判断这个权限requestCode是否正确
        if (requestCode < 0 || requestCode >= Permission.PERMISSION_LENGTH) {
            SuperLog.e("权限code不存在动态获取的requestPermissions数组中:" + requestCode);
            return;
        }
        //可以获取的权限
        final List<String> permissionsList = getNoGrantedPermission(context, requestCode, false);
        //已经拒绝过的权限并且选择不再提示
        final List<String> shouldRationalePermissionsList = getNoGrantedPermission(context, requestCode, true);

        //TODO checkSelfPermission
        if (permissionsList == null || shouldRationalePermissionsList == null) {
            return;
        }
        SuperLog.e("可以授予的权限列表" + permissionsList.size() + ",被拒绝的权限列表:" + shouldRationalePermissionsList.size());

        if (permissionsList.size() > 0) {
            ActivityCompat.requestPermissions((Activity) context, permissionsList.toArray(new String[permissionsList.size()]),
                    requestCode);
        } else if (shouldRationalePermissionsList.size() > 0) {
            shouldShowRationale(context, requestCode, shouldRationalePermissionsList.toArray(new String[permissionsList.size()]));
        } else {
            grant.onPermissionGranted(requestCode);
        }

    }

(5)在权限申请的时候,做一个拒绝权限之后再次点击的弹出框

 /**
     * 权限首次获取拒绝后再次弹出对话框提示为什么要获取这个权限
     *
     * @param context
     * @param requestCode
     * @param requestPermission
     */
    private static void shouldShowRationale(final Context context, final int requestCode, final String[] requestPermission) {
        String[] permissionsHint = context.getResources().getStringArray(R.array.permissions);
        SuperLog.e("被拒绝过,需要弹出对话框来提示,动态获取权限" + requestPermission);
        showMessageOKCancel(context, permissionsHint[requestCode], (dialog, which) -> {
            ActivityCompat.requestPermissions((Activity) context, requestPermission,
                    requestCode);
            SuperLog.e("动态获取拒绝过的多个权限");
        });
    }

    /**
     * 对话框弹出
     *
     * @param context
     * @param message
     * @param okListener
     */
    private static void showMessageOKCancel(final Context context, String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(context)
                .setTitle("权限获取")
                .setMessage(message)
                .setPositiveButton("好的", okListener)
                .setNegativeButton("取消", null)
                .create()
                .show();
    }

(5)在权限申请的时候,如果是拒绝并且选择不再提示,这样就没办法获取权限了,只能提示用户,您需要跳转设置去设置

/**
     * 跳转Setting页面
     *
     * @param context
     * @param message
     */
    private static void openSettingActivity(final Context context, String message) {
        showMessageOKCancel(context, message, (dialog, which) -> {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            SuperLog.e(context.getPackageName());
            Uri uri = Uri.fromParts("package", context.getPackageName(), null);
            intent.setData(uri);
            context.startActivity(intent);
        });
    }

(6)需要制作一个权限的成功的回调接口

/**
     * onRequestPermissionsResult的请求结果回调
     *
     * @param context
     * @param requestCode
     * @param permissions
     * @param grantResults
     * @param permissionGrant
     */
    public static void requestGroupResult(@NonNull Context context, final int requestCode, String[] permissions, int[] grantResults, PermissionGrant permissionGrant) {
        Map<String, Integer> perms = new HashMap<>();
        ArrayList<String> notGranted = new ArrayList<>();
        for (int i = 0; i < permissions.length; i++) {
            SuperLog.e("第" + i + "个权限, 权限名称:" + permissions[i] + ",权限授予结果:" + grantResults[i]);
            perms.put(permissions[i], grantResults[i]);
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                notGranted.add(permissions[i]);
            }
        }
        if (notGranted.size() == 0) {
            Toast.makeText(context, "权限都授予成功", Toast.LENGTH_SHORT)
                    .show();
            permissionGrant.onPermissionGranted(requestCode);
        } else {
            openSettingActivity(context, "因为已经拒绝了权限请求,如果想用这个功能,请去设置页面进行权限设置!");
        }
    }

(7)配置文件配置

在string.xml文件里面配置

    <string name="permission_get_accounts_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_GET_ACCOUNTS</string>
    <string name="permission_read_phone_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_PHONE_STATE</string>
    <string name="permission_call_phone_hint">没有电话权限,无法开启这个功能,请开启电话权限。</string>
    <string name="permission_camera_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_CAMERA</string>
    <string name="permission_access_fine_location_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_ACCESS_FINE_LOCATION</string>
    <string name="permission_access_coarse_location_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_ACCESS_COARSE_LOCATION</string>
    <string name="permission_read_external_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_EXTERNAL_STORAGE</string>
    <string name="permission_white_external_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_WRITE_EXTERNAL_STORAGE</string>
    <string name="permission_recode_audio_hint">没有此权限,无法开启这个功能,请开启权限。PERMISSION_RECORD_AUDIO</string>

values文件夹下建一个array.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="permissions">
        <item>@string/permission_camera_hint</item>
        <item>@string/permission_sensors_hint</item>
        <item>@string/permission_microphone_hint</item>
        <item>@string/permission_calendar_hint</item>
        <item>@string/permission_location_hint</item>
        <item>@string/permission_storage_hint</item>
        <item>@string/permission_contacts_hint</item>
        <item>@string/permission_sms_hint</item>
        <item>@string/permission_phone_hint</item>
    </string-array>
</resources>

三.工具类的使用

假设在一个MainActivity中的一个buttom的点击事件中

1.请求权限方法

 Button button = findViewById(R.id.getPermisson);
        button.setOnClickListener(v-> {
                PermissionHelper.requestGroupPermission(MainActivity.this, Permission.CODE_PHONE,mPermissionGrant);
        });

2.权限结果回调,进行之后的操作

private PermissionHelper.PermissionGrant mPermissionGrant = requestCode-> {
            switch (requestCode) {
                case Permission.CODE_CAMERA:
                  /*  SuperLog.e("已经获取打开摄像头权限");
                    Toast.makeText(MainActivity.this, "已经获取打开摄像头权限", Toast.LENGTH_SHORT).show();*/
                    Intent intent = new Intent();
                    // 指定开启系统相机的Action
                    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                    startActivityForResult(intent, 1);
                    break;
                case Permission.CODE_PHONE:
                    SuperLog.e("已经获取打开摄像头权限");
                    Toast.makeText(MainActivity.this, "已经获取打开摄像头权限", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
        }
    };

    /**
     * Callback received when a permissions request has been completed.
     */
    @Override
    public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        PermissionHelper.requestGroupResult(this, requestCode,permissions,grantResults, mPermissionGrant);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容