Permission(使用与框架使用)

14 篇文章 0 订阅
订阅专栏
目录
   一、引言
   二、效果
   三、Normal Permission和Dangerous Permission
   四、实现支持运行时权限
   五、permissionsdispatcher框架的使用
一、引言

  在Android 6.0以前(targetSdkVersion 23)以前,我们安装APP时会列出所有该APP在Manifest中列出的访问权限,而且只会出现一次,一旦我们同意安装此APP并同意所有权限,APP就可以在用户不知情的情况下访问手机中的数据,包括(通讯录、定位)等隐私,在6.0以后,APP在运行时会一个一个询问用户授予权限。


二、效果

正常允许权限:
在这里插入图片描述

拒绝允许权限的处理
在这里插入图片描述


三、Normal Permission和Dangerous Permission

Google给出的关于权限分类的官方文档,
https://developer.android.google.cn/guide/topics/security/permissions.html#normal-dangerous

Dangero Permission以分组形式给出
在这里插入图片描述

在Android6.0(API 23) 到8.0(API 26)之间,同一组的任何权限被授权了,其他权限也自动授权,此外对于申请时弹出的提示框上面的文本说明也是对整个权限组的说明,而不是单个权限的说明。但是Android 8.0(APi 26)以后对于危险权限需要一个一个的申请。


四、实现支持运行时权限

1、首先是我们拨打电话的点击事件:

 dialBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                call();
            }
        });

2、这时进行权限的检查,是否拥有拨打电话的权限,如果有则进行拨号,如果没有进行权限的申请:

 private void call() {
        //检查APP是否有权限
        if(ActivityCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
            //如果没有
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},PERMISSION_REQURST_CALL_PHONE);
        }else{
            callPhone();
        }
    }
    
    /**
     * 拨打电话
     */
    private void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:"+ 10086);
        intent.setData(data);
        startActivity(intent);
    }

3、权限申请回调的处理:

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == PERMISSION_REQURST_CALL_PHONE){
            if(grantResults[0] != 0  && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            //允许申请的权限
                callPhone();
            }else{
            //申请权限被拒绝
            Toast.makeText(this,"申请权限被拒绝",Toast.SHORTTIME).show();
                
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

4、处理“不再询问”选项
  在申请权限时,如果我们点击“拒绝”,则下一次还会继续弹出权限申请框,只不过这一次会多出来一项“不再询问”,如果我们勾选了这个选项,则下一次不会再弹出此权限申请框,用户需要去设置—》应用权限列表中手动打开权限。

在这里插入图片描述

用户对于已经勾选“不再询问”的权限,每次调用该权限API时都会失效,用户无法使用该功能,这显然不会带来好的用户体验,这个时候我们需要使用shouldShowRequestPermissionRationale()方法向用户解释权限使用情况,并设置进入应用的设置权限所在:
在这里插入图片描述

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == PERMISSION_REQURST_CALL_PHONE){
            if(grantResults[0] != 0  && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                callPhone();
            }else{
                if(!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.CALL_PHONE)){
                    final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
                            .setTitle("提示")
                            .setMessage("该功能需要访问电话的权限,否则无法使用")
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialogInterface.dismiss();
                                }
                            })
                            .setPositiveButton("前去设置", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    //跳转到当前APP的设置页面
                                    Intent intent = new Intent();
                                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                                    intent.setData(Uri.parse("package:" + getPackageName()));
                                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                                    startActivity(intent);
                                }
                            }).create();
                    dialog.show();
                }
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
五、permissionsdispatcher框架的使用

1、依赖
在Project的build.gradle 中添加如下代码:

dependencies {
        ...
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
     
    }

在app的build.gradle中添加依赖:

dependencies {
    implementation 'com.github.hotchemi:permissionsdispatcher:2.1.3'
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3'
}

permissionsdispatcher以注释的方式进行权限的处理,其中几个重要的注释:

注释名称注释解释
RuntimePermissions必要的注释,用来注册一个Activity或者一个Fragment,使他们可以处理权限
NeedsPermission必要的注释,在需要获取权限的地方进行注释,用来获取权限
OnShowRationale提示用户为何需要开启此权限,在用户选择拒绝后,再次需要访问该权限时调用
OnPermissionDenied用户选择拒绝时的提示
OnNeverAskAgain用户选择不再询问后的提示

代码如下:


import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;

@RuntimePermissions
public class SecondActivity extends AppCompatActivity {

    private Button dialBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        initView();
    }

    private void initView() {
        dialBtn = (Button) findViewById(R.id.dial_btn);
        dialBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              
            }
        });
    }

    @NeedsPermission(Manifest.permission.CALL_PHONE)
    //在需要获取权限的地方注释
    void call(){
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + 10086);
        intent.setData(data);
        startActivity(intent);
    }

    @OnShowRationale(Manifest.permission.CALL_PHONE)
    //提示用户为何要开启权限
    void showWhy(final PermissionRequest request){
        new AlertDialog.Builder(SecondActivity.this)
                .setMessage("提示用户为何要开启权限")
                .setPositiveButton("知道了", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        request.proceed(); //再次执行权限请求
                    }
                })
                .show();
    }

    @OnPermissionDenied(Manifest.permission.CALL_PHONE)
    void showDenied(){
        Toast.makeText(SecondActivity.this,"用户选择拒绝时的提示",Toast.LENGTH_SHORT).show();
    }

    @OnNeverAskAgain(Manifest.permission.CALL_PHONE)
    void showNotAsk(){
        new AlertDialog.Builder(SecondActivity.this)
                .setMessage("该功能需要访问电话的权限,不开启将无法使用该功能")
                .setPositiveButton("前去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //跳转到当前APP的设置页面
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        intent.addCategory(Intent.CATEGORY_DEFAULT);
                        intent.setData(Uri.parse("package:" + getPackageName()));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                        intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                        startActivity(intent);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .show();
    }

}

这个时候我们编译程序,会生成一个辅助类SecondActivityPermissionsDispatcher,下面的事情由它进行解决,完整代码:

@RuntimePermissions
public class SecondActivity extends AppCompatActivity {

    private Button dialBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        initView();
    }

    private void initView() {
        dialBtn = (Button) findViewById(R.id.dial_btn);
        dialBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
           //*****************重点*****************
           SecondActivityPermissionsDispatcher.callWithCheck(SecondActivity.this);
            }
        });
    }

    @NeedsPermission(Manifest.permission.CALL_PHONE)
    //在需要获取权限的地方注释
    void call(){
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + 10086);
        intent.setData(data);
        startActivity(intent);
    }

    @OnShowRationale(Manifest.permission.CALL_PHONE)
    //提示用户为何要开启权限
    void showWhy(final PermissionRequest request){
        new AlertDialog.Builder(SecondActivity.this)
                .setMessage("提示用户为何要开启权限")
                .setPositiveButton("知道了", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        request.proceed(); //再次执行权限请求
                    }
                })
                .show();
    }

    @OnPermissionDenied(Manifest.permission.CALL_PHONE)
    void showDenied(){
        Toast.makeText(SecondActivity.this,"用户选择拒绝时的提示",Toast.LENGTH_SHORT).show();
    }

    @OnNeverAskAgain(Manifest.permission.CALL_PHONE)
    void showNotAsk(){
        new AlertDialog.Builder(SecondActivity.this)
                .setMessage("该功能需要访问电话的权限,不开启将无法使用该功能")
                .setPositiveButton("前去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //跳转到当前APP的设置页面
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        intent.addCategory(Intent.CATEGORY_DEFAULT);
                        intent.setData(Uri.parse("package:" + getPackageName()));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                        intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                        startActivity(intent);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            //*****************重点*****************
            SecondActivityPermissionsDispatcher.onRequestPermissionsResult(SecondActivity.this,requestCode,grantResults);
    }
}

OK ,这是权限里面的内容了,希望能帮到你

XXPermission框架动态获取权限
weixin_42451072的博客
07-26 3306
Android动态获取权限 XXPermissions 万能快速集成使用 框架地址链接: https://pan.baidu.com/s/1smA5HfxvitnuQXjORQVu0Q 提取码: nbka 复制这段内容后打开百度网盘手机App,操作更方便哦 具体方法 XXPermissions框架使用简单快捷,在XXPermissions框架便捷的基础上,又简单封装个方法,适合多数app在初始化时...
Android之使用Android-query框架开发实战(二)
01-20
在Android应用开发中,使用Android-query(AQuery)框架可以极大地简化网络请求和数据解析的过程。本文将深入探讨如何使用AQuery进行异步网络操作,并通过示例代码展示其功能。 首先,要使用AQuery进行网络操作,必须...
java开发必备知识(三)
weixin_55829616的博客
07-16 492
Permission(role = UserRole.LOGIN) 是一个自定义注解,用于声明一个方法或类需要的权限。该注解可以用于控制访问权限,在访问一个方法或类时,可以根据当前用户的角色类型判断是否有足够的权限进行访问。在实际应用中,可以通过AOP 技术来实现 @Permission 注解的功能。通过在 AOP 中拦截方法调用,判断当前用户的角色类型,再根据 @Permission 注解中指定的权限要求,进行访问控制和权限验证。
permission
06-27
Spring、SpringMVC、Ibitas自己做的一套权限的实例,还附带了一个单终端登录
LuaRocks 安装及使用教程
最新发布
gitblog_01126的博客
08-13 461
LuaRocks 安装及使用教程 luarocksLuaRocks is the package manager for the Lua programming language.项目地址:https://gitcode.com/gh_mirrors/lu/luarocks 1. 项目介绍 LuaRocks 是 Lua 语言的包管理器,它用于创建和安装 Lua 模块,这些模块以自包含的包(称为...
Android权限管理之Permission权限机制及使用
11-18 377
前言: 最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,所以选择先去了解一下Android的Permission权限机制及使用 权限管理相关博客: ...
Permission
04-27
android官网提供的Permission实践
安卓 @PermissionRequest 和 @Permission
weixin_35756624的博客
02-09 543
@PermissionRequest 是用来请求访问权限的注解,而 @Permission 是用来描述访问权限的注解。 在 Android 中,应用程序需要获得用户的许可才能访问手机上的一些资源,例如相机、位置信息、存储等。这些资源的访问权限需要在应用程序安装时申请,并且用户需要在安装应用程序时进行授权。 @PermissionRequest 注解用于在代码中请求访问权限,例如: @Permiss...
Android中XUtils3框架使用方法详解(一)
09-01
此外,为了正常使用网络和存储功能,需要在AndroidManifest.xml文件中添加相应的权限声明,如`<uses-permission android:name="android.permission.INTERNET" />`和`<uses-permission android:name="android....
XXPermission框架动态获取权限-附件资源
03-02
XXPermission框架动态获取权限-附件资源
Hzero @Permission注解解析
weixin_43897490的博客
03-25 8736
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package io.choerodon.swagger.annotation; import io.choerodon.core.iam.ResourceLevel; import java.lang.annotation.ElementType; import java.lang.annota
安卓手机app权限管理 APK Permission Remover 下载及使用
djl的专栏,blog.djl.cx好记
02-19 7084
安卓手机app权限管理 APK Permission Remover 系统自动的权限管理无法禁止震动,所以用到这个工具。是将apk移除权限后重新打包,因为与原apk签名不一样,需要先卸载后安装。 安全性考虑,金融类软件勿使用。 下载地址:https://apkmodmirror.com/apk/com.gmail.heagoo.apkpermremover.pro/apk-permissio...
permissions
jiang_xiaoo24的博客
03-21 422
1、在model表中添加用户user owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE) 2、在序列化表中添加如下关联信息 对应表 owner = serializers.ReadOnlyField(source='owner.username') 用户表 ...
【Code-Snippet】Permission权限
weixin_33979203的博客
03-21 202
0. Thanks To android 6.0权限全面详细分析和解决方案 1. 概述 在Android6.0及其以上,对权限进行了进一步限制。一些危险级别的权限,需要代码中去向用户申请才能使用,不然,会报异常:java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvi...
Permission 使用详解
程序员Android
04-18 6892
极力推荐文章:欢迎收藏Android 干货分享本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:安全架构设计应用签名用户ID 和...
功能清单使用permission进行自定义权限
yuezheyue123的博客
10-17 928
在功能清单中的permission使用,可以进行自定义权限,给四大组件添加必要的权限。当使用隐式intent进行跨应用进行调用的时候提高安全程度。 比如在app1中的功能清单中 1.进行声明权限 设定权限,注意要添加category,否则隐式的intent的不能进行接受。 2.在app2中进行启动app1中的activity。发送隐式的intent。 3.对于protectionLevel...
Permission相关详解
amchencute2的博客
03-01 430
[size=medium]1,Permission类介绍[/size] [b]java.security.Permission [/b] This abstract class is the ancestor of all permissions. Permission类的子类: [list] [*]AllPermission [*]BasicPermission [*...
android permission大全(各种权限)
信笔涂鸦
03-01 499
android.permission.ACCESS_CHECKIN_PROPERTIES   允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded
如何使用fastble框架
05-05
FastBLE是一个基于Android的蓝牙BLE库,使用它可以简化开发蓝牙BLE相关的应用程序。...以上就是使用FastBLE框架进行蓝牙BLE开发的基本步骤。具体操作可以参考官方文档:https://github.com/Polidea/RxAndroidBle。
写文章

热门文章

  • Android Notification通知使用(从基本到高级) 52764
  • Permission(使用与框架使用) 30381
  • Unable to load class 'org.gradle.api.internal.component.Usage'. 6013
  • Socket编程基础(五)——通过Socket实现UDP编程 5180
  • NiceVieoPlayer一步一步教你打造自己的视频播放器 4433

分类专栏

  • HarmonyOS 13篇
  • MySQL 3篇
  • JetPack专栏 6篇
  • Python 7篇
  • Android进阶 14篇
  • Java 9篇
  • Kotlin 1篇
  • Android基础 3篇
  • 杂谈 3篇

最新评论

  • HarmonyOS学习(十一)——安全管理

    ImomoTo: thanks for u affirmation表情包

  • HarmonyOS学习(十一)——安全管理

    征途黯然.: This HarmonyOS学习十一安全管理 article is truly great and very insightful.表情包

  • HarmonyOS学习(一)——Stage模型

    CSDN-Ada助手: 推荐 Python入门 技能树:https://edu.csdn.net/skill/python?utm_source=AI_act_python

  • NiceVieoPlayer一步一步教你打造自己的视频播放器

    酴醾绛桐: 那个布局使用不了耶,这要怎么办呢?build也设置了

  • Android Notification通知使用(从基本到高级)

    weixin_51209696: 哥,构建Notification对象的时候不需要引入channel id吗

大家在看

  • 刘润《关键跃升》读书笔记9 247
  • 问: `Thread.interrupted()` 和 `Thread.currentThread().isInterrupted()` 之间有什么区别?
  • 青少年编程与数学 01-010 青少年成长管理 附录一、图书推荐 798
  • 分治算法专题(一)——快速排序之【三路划分】/归并排序 926
  • 考研数学精解【6】

最新文章

  • HarmonyOS学习(十三)——数据管理(二) 关系型数据库
  • HarmonyOS学习(十二)——数据管理(一)分布式数据
  • HarmonyOS学习(十一)——安全管理
2024年13篇
2022年4篇
2021年17篇
2020年2篇
2019年28篇
2018年3篇
2016年1篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为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 网站制作 网站优化