Permission权限管理——隐私权限具体说明

2 篇文章 0 订阅
订阅专栏


1、应用场景

   最近在做银行的项目,经过测试中心测试后提出需求,对于隐私权限需要满足以下两点:
       1. 隐私权限的申请应该依托于具体的业务场景,在不需要某个隐私权限的场景内不得申请该权限,非业务需要的隐私权限不得阻碍正常的业务流程。
       2. 需要明确告知用户具体的隐私权限用途,提供用户可以取消权限授权的途径。
针对以上两点我对应用隐私权限的申请进行了整合以及封装,支持在项目中最少量的代码调用,当然这里并不是封装成jar包,用兴趣的同学可以自己封装。

2、实际效果

这里我在权限申请之前告知用户具体的权限用途,文字描述可以根据实际的业务场景来描述,弹窗效果参照了网上的一位兄弟写的,链接如下 https://github.com/haiyuKing/PermissionDialog

3、权限申请
1. PermissionDialogUtil类

这个类就是权限申请前的弹窗类,具体说明权限用途,文章最后我会提供源码,这里我们只看一下核心的代码

	/**
    * 初始化权限列表
    * @param filter
    * @param type
    */

   private void initItem(ColorMatrixColorFilter filter,int type){
       //初始化权限列表区域
       View itemView = View.inflate(mContext, R.layout.permission_list_item, null);
       String[] permissionTitles = mContext.getResources().getStringArray(R.array.permission_title);
       String[] permissionInfos = mContext.getResources().getStringArray(R.array.permission_info);
       String title = permissionTitles[type];
       String info = permissionInfos[type];
       ((ImageView) itemView.findViewById(R.id.item_img)).setImageResource(mContext.getResources().obtainTypedArray(R.array.permission_icon).getResourceId(type, 0));
       ((ImageView) itemView.findViewById(R.id.item_img)).setColorFilter(filter);
       ((TextView) itemView.findViewById(R.id.item_title)).setText(title);
       ((TextView) itemView.findViewById(R.id.item_info)).setText(info);

       mListLayout.addView(itemView);
   }
	````
	这里就是权限名称以及相应描述和图片的创建。具体内容我们声明在attrs.xml文件中,内容如下:
	````c
	<!-- 权限图标【可根据实际情况修改】注意位置要和下边title、info相对应 -->
   <integer-array name="permission_icon">
       <item>@drawable/permission_ic_storage</item>
       <item>@drawable/permission_ic_camera</item>
       <item>@drawable/permission_ic_location</item>
       <item>@drawable/permission_ic_phone</item>
       <item>@drawable/permission_ic_phone</item>
       <item>@drawable/permission_ic_micro_phone</item>
       <item>@drawable/permission_ic_calendar</item>
       <item>@drawable/permission_ic_contacts</item>
       <item>@drawable/permission_ic_sms</item>
       <item>@drawable/permission_ic_sensors</item>
   </integer-array>

   <!-- 权限标题【可根据实际情况修改 -->
   <string-array name="permission_title">
       <item>文件存储</item>
       <item>照相机</item>
       <item>位置信息</item>
       <item>本机识别码</item>
       <item>拨打电话</item>
       <item>录制声音</item>
       <item>日程信息</item>
       <item>通讯录</item>
       <item>短信信息</item>
       <item>传感器</item>
   </string-array>

   <!-- 权限说明(这里应该是根据项目的实际情况,简要说明下该权限主要用于什么场景或者功能)【可根据实际情况修改】 -->
   <string-array name="permission_info">
       <item>允许应用读取、写入外部存储,应用于版本更新、相册功能</item>
       <item>允许应用访问摄像头进行拍照,应用于个人头像功能</item>
       <item>允许应用获取定位信息</item>
       <item>允许应用获取本机识别码,应用于账号和手机的绑定关系,该权限为必须权限</item>
       <item>允许应用内拨打电话,应用于联系客服</item>
       <item>允许应用通过手机或耳机的麦克风录制声音</item>
       <item>允许应用读取用户的日程信息</item>
       <item>允许应用访问联系人通讯录信息</item>
       <item>允许应用获取短信信息</item>
       <item>允许应用获取传感器信息</item>
   </string-array>

注意标题、图像、描述位置是一一对应的,这里权限的位置在后边我们会用到。

2. PermissionUtils类
 	 public static void checkPermission(final Activity activity, final OnPermissionListener grantedListener, final String... permissions) {
        boolean havePermission = true;
        final ArrayList<Integer> types = new ArrayList<Integer>();
        for (String permission : permissions) {
            switch (permission) {
                case Manifest.permission.WRITE_EXTERNAL_STORAGE:
                case Manifest.permission.READ_EXTERNAL_STORAGE:
                    if (!types.contains(PermissionType.STORAGE)) {
                        types.add(PermissionType.STORAGE);
                    }
                    break;
                case Manifest.permission.CAMERA:
                    if (!types.contains(PermissionType.CAMERA)) {
                        types.add(PermissionType.CAMERA);
                    }
                    break;
                case Manifest.permission.READ_PHONE_STATE:
                    if (!types.contains(PermissionType.PHONE)) {
                        types.add(PermissionType.PHONE);
                    }
                    break;
                case Manifest.permission.CALL_PHONE:
                    if (!types.contains(PermissionType.CALLPHONE)) {
                        types.add(PermissionType.CALLPHONE);
                    }
                    break;
                case Manifest.permission.ACCESS_COARSE_LOCATION:
                    if (!types.contains(PermissionType.LOCATION)) {
                        types.add(PermissionType.LOCATION);
                    }
                    break;
                case Manifest.permission.READ_SMS:
                case Manifest.permission.SEND_SMS:
                    if (!types.contains(PermissionType.SMS)) {
                        types.add(PermissionType.SMS);
                    }
                    break;
                default:
                    break;
            }
            if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
                havePermission = false;
            }
        }
        if (!havePermission) {
            PermissionDialogUtil permissionDialog = new PermissionDialogUtil(activity, types);
            permissionDialog.setOnSureClickListener(new PermissionDialogUtil.OnSureClickListener() {
                @Override
                public void onSureClick() {
                    types.clear();
                    RxPermissions rxPermission = new RxPermissions((FragmentActivity) activity);
                    rxPermission
                            .requestEachCombined(permissions)
                            .subscribe(new Consumer<Permission>() {
                                @Override
                                public void accept(Permission permission) throws Exception {
                                    if (permission.granted) {
                                        grantedListener.onGranted();
                                    } else if (permission.shouldShowRequestPermissionRationale) {
                                        grantedListener.onRefused();
                                    } else {
                                        DialogUtils.showDotAskDialog(activity, new DialogUtils.OnDialogClickListener() {
                                            @Override
                                            public void confirm() {
                                                goSystemStetting(activity);
                                            }

                                            @Override
                                            public void cancel() {
                                            }
                                        });
                                    }
                                }
                            });
                }
            });
            permissionDialog.show();

        } else {
            grantedListener.onGranted();
        }
    }
	````
	在checkPermission方法中,我们比对传递过来的权限,只有需要申请的权限才会显示在弹窗中,PermissionType是一个枚举类如下:
	````
	public interface PermissionType {
    @IntDef({STORAGE, CAMERA, LOCATION, PHONE, CALLPHONE, SMS})
    @Retention(RetentionPolicy.SOURCE)
    @interface Type {
    }

    int STORAGE = 0;
    int CAMERA = 1;
    int LOCATION = 2;
    int PHONE = 3;
    int CALLPHONE = 4;
    int SMS = 8;
	}

注意声明的枚举后边的数字要等同于上边attrs中权限的实际位置,例如sms在attrs中就处于第八个,当然这个顺序可以自己更改,只要能对应上即可。
    权限的申请流程我使用了RxPermissions的requestEachCombined方法,这个方法会将申请的权限当成一组权限,只有全部允许permission.granted才会为true,permission.shouldShowRequestPermissionRationale方法可以用来判断用户是否设置了不在提醒按钮,对于这种权限我的处理方法是下次申请直接跳转到设置页面中,让用户自行开启。DialogUtils.showDotAskDialog弹窗就是用来实现这个功能,内容简单不做介绍,源码中有。

3. 具体调用

我们只需要在需要权限申请的位置调用

 	PermissionUtils.checkPermission(this, new OnPermissionListener() {
                    @Override
                    public void onGranted() {

                    }

                    @Override
                    public void onRefused() {
                        Toast.makeText(getActivity(), "用户拒绝", Toast.LENGTH_SHORT).show();
                    }
                }, Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.READ_SMS);

    在onGranted()方法中处理允许流程,onRefused()处理拒绝流程,如果是在Fragment中调用我们只需要将传入的this换成getActivity()。具体需要申请的权限个数不固定,也可以传入一个。

4、权限管理

对于应用中需要的隐私权限我们需要对他们进行管理,效果参照支付宝。

实现也很简单,我们只需要在PermissionUtils类中增加一个checkPermission()方法,这个方法是用来判断权限是否申请。

 public static boolean checkPermission(final Activity activity, String... permissions) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

然后我们在权限管理页面的onResume()方法中进行状态的判断即可。

 @Override
    public void onResume() {
        super.onResume();
        if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)) {
            ps_storage.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));
        } else {
            ps_storage.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));
        }
        if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.CAMERA)) {
            ps_camera.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));
        } else {
            ps_camera.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));
        }
        if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
            ps_location.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));
        } else {
            ps_location.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));
        }
        if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.CALL_PHONE)) {
            ps_phone.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));
        } else {
            ps_phone.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));
        }
        if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.READ_SMS)) {
            ps_sms.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));
        } else {
            ps_sms.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));
        }
    }

跳转手机设置中心的方法如下:

 	public void goSystemStetting() {
        Intent intent = getAppDetailSettingIntent();
        startActivity(intent);
    }
    private Intent getAppDetailSettingIntent() {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            localIntent.setData(Uri.fromParts("package", getActivity().getPackageName(), null));
        } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
            localIntent.setAction(Intent.ACTION_VIEW);
            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
            localIntent.putExtra("com.android.settings.ApplicationPkgName", getActivity().getPackageName());
        }
        return localIntent;
    }
5、项目地址

https://github.com/li-21/PermissionU

Linux学习总结(81)—— Linux 权限详解
科技D人生
03-03 419
前言 我们在使用 Linux 的过程中,或多或少都会遇到一些关于使用者和群组的问题,比如最常见的你想要在某个路径下执行某个指令,会经常出现这个错误提示 。permission denied。反正我大概率见到这个错误都是在使用 FTP 传输文件的时候,等了半天传输百分比还是零,我说网络这么慢么?怎么都不传输呢?其实我不知道,这是由于权限问题所致。我一般的修复方式是直接赋予 777 权限,或者直接使用 su 管理员登录,遇到这种问题就是说你的权限不够。 使用者和群组 在 Linux 中,关于文件所有者分为
Permission权限管理
11-23
Permission权限管理软件 Permission权限管理 Permission权限管理
【Code-Snippet】Permission权限
weixin_33979203的博客
03-21 203
0. Thanks To android 6.0权限全面详细分析和解决方案 1. 概述 在Android6.0及其以上,对权限进行了进一步限制。一些危险级别的权限,需要代码中去向用户申请才能使用,不然,会报异常:java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvi...
Django之权限
Lovehanxiaoyan的博客
02-23 321
权限Permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object()获取具体对象时,会进行对象访问权限的判断 使用 可以在配置文件中设置默认的权限管理类,如 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( ...
Permission权限大全
weixin_30848775的博客
02-23 569
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 an...
Android Permission权限总结
最新发布
weixin_64679863的博客
03-14 3617
以前开发的时候需要短信的权限,图省事,我们只申请READ_CONTACTS权限,同组的其它权限也会自动获取,这时不仅拥有读取联系人的权限,写联系人的权限也有了。在阅读官方指南的时候,发现官方推荐在动态申请权限的时候调用这个方法,是否需要在动态申请权限之前给用户一个友好的提示:告诉用户为什么我的应用需要申请这个权限,而不是不管三七二十一就向用户申请权限。对于targetSdkVersion ≥ 23而言,应用的某些操作需要的权限是动态申请的,在操作前一定要检测是否有该权限。需要动态申请,也可取消授权。
android权限permission)大全
易寻资料的博客
02-24 6414
1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流 4.android.permission.WRITE_SMS允许程序写短信 5.android.permission.WRITE_SETTINGS允许程序读取或写入系统设置
动态权限 Permission
06-14
Android 6.0(API级别23)开始,引入了一种新的权限管理模式——动态权限(Dynamic Permissions)。相较于早期版本的静态权限申请,动态权限允许应用在运行时请求用户授予特定的敏感权限,而非在安装时一次性获取...
API 25 (Android 7.1.1 API) Manifest.permission——权限
上帝也疯狂
12-07 6749
Manifest.permission public static final class Manifest.permission extends Object Added in API level 1   java.lang.Object    ↳android.Manifest.permission   【常量】 String ACCESS_CHECKI
APK权限大选———Android开发必懂知识
11-20
### APK权限大选———Android开发必懂知识 在当今高度数字化的社会中,智能手机已成为我们生活中不可或缺的一部分。而Android作为全球最受欢迎的移动操作系统之一,其应用程序(APK)的权限管理变得尤为重要。本文...
RTPermission:[Deprecated] Android6.0 运行时权限申请工具,Android Marshmallow runtime permission utils
05-12
[Deprecated] 推荐使用 RTPermission Android6.0 运行时权限申请工具,Android Marshmallow runtime permission utils RTPermission 想了解该项目可参考下面的博客: 前言 Android6.0发布后带来的运行时权限机制,使得开发者的工作又多了一点,在程序需要使用到9类敏感权限时必须去动态申请权限使用权,然而按照标准写法实在是太繁琐了,要是每一个权限都写一大堆申请步骤,我估计开发者分分钟暴走。所以,封装一个统一的请求框架是很有必要的,RTPermission就是为了简化申请步骤而做的,有需要的可参考一下,欢迎star和fork。 使用方式: 【最新版本号以为准】 1. Gradle中引入库 #last-version请查看上面的最新版本号 #AndroidStudio3.0以下 co
PermissionUtils:轻松检查棉花糖许可
05-11
权限实用程序 轻松检查棉花糖许可 进口 目前,该图书馆在我的个人Maven仓库中 repositories { maven { url ' http://dl.bintray.com/raphaelbussa/maven ' } } dependencies { compile ' rebus:permission-utils:2.0.7 ' } 如何使用 申请权限 首先,重写onRequestPermissionsResult并调用PermissionManager.handleResult(requestCode,Permissions,grantResults); @Override public void onRequestPermissionsResult( int requestCode, @NonNull String [] p
android 角色管理,Android权限管理Permission权限机制及使用
weixin_31424199的博客
05-25 823
前言:围绕着面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,所以选择先去了解一下AndroidPermission权限机制及使用权限管理相关博客:Android权限机制:权限是一种安全机制。Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。Android权限使用:1.)在AndroidM...
安卓之权限的问题
小鹿麋鹿的博客
05-17 936
Android6.0,及api23以上,Android系统有些权限需要运行时动态申请。 android权限分为两类:一类是正常权限,另一类是危险权限。 正常权限是那些不威胁到用户的安全隐私问题的权限,对于这种权限系统会自动帮我们进行授权,而不需要我们自己去操作。 危险权限就是威胁用户安全和隐私,或者对自己的设备安全性造成影响的权限,比如获取设备电话信息、获取设备的位置等,对于这种危险权限,我们必须要由我们用户手动点击授权才能使用,否则程序就无法使用相应的功能。   在API23(含23)以上,正常权限只需
Android 权限管理
zenmela2011的专栏
11-03 3914
1.权限分级 Android权限分为四类,不同级别的权限对应不同的认证方式。 ①normal:低风险权限 只要申请了就可以使用(在AndroidManifest.xml中添加< uses-permission>标签),安装时不需要用户确认; ②dangerous:高风险权限 安装时需要用户的确认才可使用; ③signature: 只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授给它; ④signatureOrSy
Android PermissionUtils:运行时权限工具类及申请权限的正确姿势
ifadai的博客
06-16 5776
PermissionUtil 经常写Android运行时权限申请代码,每次都是复制过来之后,改一下权限字符串就用,把代码搞得乱糟糟的,于是便有了封装工具类的想法,话不多说,先看怎么用: 工具类及Demo:github 简洁版申请权限 申请一个权限PermissionUtils.checkAndRequestPermission(mContext, PERM
动态权限申请工具类
xiyangyang8110的博客
05-12 328
from 腾讯云demo app PermissionUtils.permission(PermissionUtils.PermissionConstants.MICROPHONE) .callback(new PermissionUtils.SimpleCallback() { @Override public void
Android 动态获取权限PermissionUtils
阿Gogo
07-15 4183
1、导入第三方库: api 'com.yanzhenjie:permission:2.0.3' 2、使用Java8 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 3、新建PermissUtils类: import com.yanzhenjie.permission.AndPermission; /** * An
Android 调用checkSelfPermission,不管用户是否取消授权,checkSelfPermission的返回值始终为PERMISSION_GRANTED的解决办法
热门推荐
dynsxyc的专栏
04-17 1万+
Android M运行targetSdkVersion If your application is targeting an API level before 23 (Android M) then both:ContextCompat#checkSelfPermission and Context#checkSelfPermission doesn't work
Django权限管理Permission用法详解
"django自带的权限管理Permission用法说明" Django框架内建了一套完善的权限管理系统,名为Permission,它主要用于控制不同用户对特定模型(Model)的操作权限。本篇文章将详细解析Django自带的权限管理Permission...
写文章

热门文章

  • Permission权限管理——隐私权限具体说明 3675
  • CoordinatorLayout+ToolbarLayout+Behavior实现动态搜索框 903
  • 前言 202

分类专栏

  • UI 2篇
  • 自述 1篇

最新评论

  • CoordinatorLayout+ToolbarLayout+Behavior实现动态搜索框

    CHX_W: 问题解决里代码有这段,可是跑起来的项目底部还是没有显示出来?

最新文章

  • CoordinatorLayout+ToolbarLayout+Behavior实现动态搜索框
  • 前言
2020年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家安徽特色玻璃钢雕塑供应商玻璃钢动物雕塑制作工厂南京汕尾玻璃钢卡通雕塑河南肖像玻璃钢卡通雕塑公司商场玻璃钢花盆组合上海个性化玻璃钢雕塑销售电话嘉兴玻璃钢人物雕塑商家江西佛像玻璃钢雕塑多少钱安徽步行街玻璃钢雕塑多少钱玻璃钢仿汉白玉雕塑玻璃钢雕塑个人展览铸铜玻璃钢彩绘雕塑制造大型玻璃钢雕塑的好评语山东户外商场美陈批发价玻璃钢花盆种类图片闵行区拉丝玻璃钢雕塑在线咨询陕西楼盘玻璃钢园林艺术雕塑山东校园玻璃钢雕塑河南商场玻璃钢雕塑摆件江西公园玻璃钢雕塑生产厂家新乡肖像校园玻璃钢雕塑制造开阳玻璃钢雕塑订做大同节日商场美陈洛阳市玻璃钢雕塑生产厂哈市玻璃钢花盆官渡区玻璃钢雕塑定做厂家多少钱商场美陈花艺景观新沂玻璃钢花盆花器马鞍山玻璃钢雕塑性价比出众室内玻璃钢人物雕塑定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化