请问一下如何通过非正常通话权限在设置哪途径得到别人的通话记录 ,可给报酬。

52391人阅读
【Android通讯录模块开发】(10)
Android通讯录管理(获取联系人、通话记录、短信消息)
日 通讯录开发研究学习
前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选、反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清楚知道如何对Android数据库操作,异步查询数据库获取我们需要的内容。由于内容比较多,我将分三篇博客来讲述获取联系人、通话记录、短信消息的实现。
也许你根本就没耐心看,源码在这里,骚年去下吧。
上面的是获取联系人的界面效果,实现分组显示联系人,快速索引条查找联系人,下面是实现:
从权限开始:
&!-- 读联系人权限 --&
&uses-permission android:name=&android.permission.READ_CONTACTS& /&
&!-- 写联系人权限 --&
&uses-permission android:name=&android.permission.WRITE_CONTACTS& /&
&!-- 拨号权限 --&
&uses-permission android:name=&android.permission.CALL_PHONE& /&
&!-- 读短信权限 --&
&uses-permission android:name=&android.permission.READ_SMS& /&
界面布局:
/Contact_Demo/res/layout/contact_list_view.xml
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:id=&@+id/contact_list_view&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:background=&#000000& &
&com.suntek.contact.view.SlidingLinearLayout
android:id=&@+id/slidingview&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:layout_alignParentTop=&true& &
android:id=&@+id/contact_list&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:cacheColorHint=&#000000&
android:divider=&#&
android:fadingEdge=&none&
android:scrollbars=&none&
android:scrollingCache=&false&
android:visibility=&visible& /&
&/com.suntek.contact.view.SlidingLinearLayout&
&com.suntek.contact.view.QuickAlphabeticBar
android:id=&@+id/fast_scroller&
android:layout_width=&22dp&
android:layout_height=&match_parent&
android:layout_alignParentRight=&true&
android:layout_gravity=&top|right|center&
android:layout_marginTop=&0dip&
android:background=&@null&
android:scaleType=&centerInside&
android:src=&@drawable/dic_background& &
&/com.suntek.contact.view.QuickAlphabeticBar&
android:id=&@+id/fast_position&
android:layout_width=&70dip&
android:layout_height=&70dip&
android:layout_centerInParent=&true&
android:layout_gravity=&center_horizontal|top&
android:layout_margin=&34dip&
android:background=&@drawable/sort_icon_bg_click&
android:gravity=&center&
android:padding=&2dip&
android:textColor=&#404040&
android:textSize=&48dip&
android:visibility=&invisible& /&
&/RelativeLayout&
/Contact_Demo/res/layout/contact_list_item.xml
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content& &
&!-- 首字母 --&
android:id=&@+id/alpha&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:background=&#333333&
android:paddingLeft=&10dip&
android:textColor=&#FFFFFF&
android:visibility=&gone& /&
&!-- 联系人信息 --&
&QuickContactBadge
android:id=&@+id/qcb&
android:layout_width=&75dip&
android:layout_height=&75dip&
android:layout_alignParentLeft=&true&
android:layout_below=&@+id/alpha&
android:layout_marginBottom=&3dip&
android:layout_marginTop=&3dip&
android:src=&@drawable/touxiang& /&
android:id=&@+id/name&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_centerVertical=&true&
android:layout_marginLeft=&5.0dip&
android:layout_toRightOf=&@+id/qcb&
android:singleLine=&true&
android:textAppearance=&?android:textAppearanceLarge&
android:textColor=&#FFFFFF& /&
android:id=&@+id/number&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_alignParentBottom=&true&
android:layout_marginLeft=&5.0dip&
android:layout_toRightOf=&@+id/qcb&
android:singleLine=&true&
android:textAppearance=&?android:textAppearanceSmall&
android:textColor=&#FFFFFF& /&
&/RelativeLayout&
代码实现:
1. 先定义一个实体类,用来保存联系人信息
/Contact_Demo/src/com/suntek/contact/model/ContactBean.java
package com.suntek.contact.
public class ContactBean {
private int contactId; //id
private String desplayN//姓名
private String phoneN // 电话号码
private String sortK // 排序用的
private Long photoId; // 图片id
private String lookUpK
private int selected = 0;
private String formattedN
private S // 姓名拼音
public int getContactId() {
return contactId;
public void setContactId(int contactId) {
this.contactId = contactId;
public String getDesplayName() {
return desplayN
public void setDesplayName(String desplayName) {
this.desplayName = desplayN
public String getPhoneNum() {
return phoneN
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneN
public String getSortKey() {
return sortK
public void setSortKey(String sortKey) {
this.sortKey = sortK
public Long getPhotoId() {
return photoId;
public void setPhotoId(Long photoId) {
this.photoId = photoId;
public String getLookUpKey() {
return lookUpK
public void setLookUpKey(String lookUpKey) {
this.lookUpKey = lookUpK
public int getSelected() {
public void setSelected(int selected) {
this.selected =
public String getFormattedNumber() {
return formattedN
public void setFormattedNumber(String formattedNumber) {
this.formattedNumber = formattedN
public String getPinyin() {
public void setPinyin(String pinyin) {
this.pinyin =
/Contact_Demo/src/com/suntek/contact/adapter/ContactListAdapter.java
package com.suntek.contact.
import java.io.InputS
import java.util.ArrayL
import java.util.C
import java.util.HashM
import java.util.L
import java.util.S
import java.util.regex.P
import android.content.ContentU
import android.content.C
import android.graphics.B
import android.graphics.BitmapF
import android.net.U
import android.provider.ContactsC
import android.provider.ContactsContract.C
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.QuickContactB
import android.widget.TextV
import com.suntek.contact.R;
import com.suntek.contact.model.ContactB
import com.suntek.contact.view.QuickAlphabeticB
public class ContactListAdapter extends BaseAdapter {
private LayoutI
private List&ContactBean&
private HashMap&String, Integer& alphaI // 字母索引
private String[] // 存储每个章节
private C // 上下文
public ContactListAdapter(Context context, List&ContactBean& list,
QuickAlphabeticBar alpha) {
this.ctx =
this.inflater = LayoutInflater.from(context);
this.list =
this.alphaIndexer = new HashMap&String, Integer&();
this.sections = new String[list.size()];
for (int i = 0; i & list.size(); i++) {
// 得到字母
String name = getAlpha(list.get(i).getSortKey());
if (!alphaIndexer.containsKey(name)) {
alphaIndexer.put(name, i);
Set&String& sectionLetters = alphaIndexer.keySet();
ArrayList&String& sectionList = new ArrayList&String&(sectionLetters);
Collections.sort(sectionList); // 根据首字母进行排序
sections = new String[sectionList.size()];
sectionList.toArray(sections);
alpha.setAlphaIndexer(alphaIndexer);
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
public void remove(int position) {
list.remove(position);
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.contact_list_item, null);
holder = new ViewHolder();
holder.quickContactBadge = (QuickContactBadge) convertView
.findViewById(R.id.qcb);
holder.alpha = (TextView) convertView.findViewById(R.id.alpha);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.number = (TextView) convertView.findViewById(R.id.number);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
ContactBean contact = list.get(position);
String name = contact.getDesplayName();
String number = contact.getPhoneNum();
holder.name.setText(name);
holder.number.setText(number);
holder.quickContactBadge.assignContactUri(Contacts.getLookupUri(
contact.getContactId(), contact.getLookUpKey()));
if (0 == contact.getPhotoId()) {
holder.quickContactBadge.setImageResource(R.drawable.touxiang);
Uri uri = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI,
contact.getContactId());
InputStream input = ContactsContract.Contacts
.openContactPhotoInputStream(ctx.getContentResolver(), uri);
Bitmap contactPhoto = BitmapFactory.decodeStream(input);
holder.quickContactBadge.setImageBitmap(contactPhoto);
// 当前字母
String currentStr = getAlpha(contact.getSortKey());
// 前面的字母
String previewStr = (position - 1) &= 0 ? getAlpha(list.get(
position - 1).getSortKey()) : & &;
if (!previewStr.equals(currentStr)) {
holder.alpha.setVisibility(View.VISIBLE);
holder.alpha.setText(currentStr);
holder.alpha.setVisibility(View.GONE);
return convertV
private static class ViewHolder {
QuickContactBadge quickContactB
* 获取首字母
* @param str
private String getAlpha(String str) {
if (str == null) {
return &#&;
if (str.trim().length() == 0) {
return &#&;
char c = str.trim().substring(0, 1).charAt(0);
// 正则表达式匹配
Pattern pattern = pile(&^[A-Za-z]+$&);
if (pattern.matcher(c + &&).matches()) {
return (c + &&).toUpperCase(); // 将小写字母转换为大写
return &#&;
/Contact_Demo/src/com/suntek/contact/ContactListActivity.java
package com.suntek.
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.app.A
import android.content.AsyncQueryH
import android.content.ContentR
import android.database.C
import android.net.U
import android.os.B
import android.provider.ContactsC
import android.view.V
import android.widget.ListV
import com.suntek.contact.adapter.ContactListA
import com.suntek.contact.model.ContactB
import com.suntek.contact.view.QuickAlphabeticB
* 联系人列表
* @author Administrator
public class ContactListActivity extends Activity {
private ContactListA
private ListView contactL
private List&ContactBean&
private AsyncQueryHandler asyncQueryH // 异步查询数据库类对象
private QuickAlphabeticBar alphabeticB // 快速索引条
private Map&Integer, ContactBean& contactIdMap =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_list_view);
contactList = (ListView) findViewById(R.id.contact_list);
alphabeticBar = (QuickAlphabeticBar) findViewById(R.id.fast_scroller);
asyncQueryHandler = new MyAsyncQueryHandler(getContentResolver());
* 初始化数据库查询参数
private void init() {
Uri uri = monDataKinds.Phone.CONTENT_URI; // 联系人Uri;
// 查询的字段
String[] projection = { monDataKinds.Phone._ID,
monDataKinds.Phone.DISPLAY_NAME,
monDataKinds.Phone.DATA1, &sort_key&,
monDataKinds.Phone.CONTACT_ID,
monDataKinds.Phone.PHOTO_ID,
monDataKinds.Phone.LOOKUP_KEY };
// 按照sort_key升序查詢
asyncQueryHandler.startQuery(0, null, uri, projection, null, null,
&sort_key COLLATE LOCALIZED asc&);
* @author Administrator
private class MyAsyncQueryHandler extends AsyncQueryHandler {
public MyAsyncQueryHandler(ContentResolver cr) {
super(cr);
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (cursor != null && cursor.getCount() & 0) {
contactIdMap = new HashMap&Integer, ContactBean&();
list = new ArrayList&ContactBean&();
cursor.moveToFirst(); // 游标移动到第一项
for (int i = 0; i & cursor.getCount(); i++) {
cursor.moveToPosition(i);
String name = cursor.getString(1);
String number = cursor.getString(2);
String sortKey = cursor.getString(3);
int contactId = cursor.getInt(4);
Long photoId = cursor.getLong(5);
String lookUpKey = cursor.getString(6);
if (contactIdMap.containsKey(contactId)) {
// 创建联系人对象
ContactBean contact = new ContactBean();
contact.setDesplayName(name);
contact.setPhoneNum(number);
contact.setSortKey(sortKey);
contact.setPhotoId(photoId);
contact.setLookUpKey(lookUpKey);
list.add(contact);
contactIdMap.put(contactId, contact);
if (list.size() & 0) {
setAdapter(list);
super.onQueryComplete(token, cookie, cursor);
private void setAdapter(List&ContactBean& list) {
adapter = new ContactListAdapter(this, list, alphabeticBar);
contactList.setAdapter(adapter);
alphabeticBar.init(ContactListActivity.this);
alphabeticBar.setListView(contactList);
alphabeticBar.setHight(alphabeticBar.getHeight());
alphabeticBar.setVisibility(View.VISIBLE);
自定义组件:
package com.suntek.contact.
import android.content.C
import android.util.AttributeS
import android.view.MotionE
import android.widget.LinearL
public class SlidingLinearLayout extends LinearLayout {
public SlidingLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
/Contact_Demo/src/com/suntek/contact/view/QuickAlphabeticBar.java
package com.suntek.contact.
import java.util.HashM
import android.app.A
import android.content.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.T
import android.os.H
import android.util.AttributeS
import android.view.MotionE
import android.view.V
import android.widget.ImageB
import android.widget.ListV
import android.widget.TextV
import com.suntek.contact.R;
* 字母索引条
* @author Administrator
public class QuickAlphabeticBar extends ImageButton {
private TextView mDialogT // 中间显示字母的文本框
private Handler mH // 处理UI的句柄
private ListView mL // 列表
private float mH // 高度
// 字母列表索引
private String[] letters = new String[] { &#&, &A&, &B&, &C&, &D&, &E&,
&F&, &G&, &H&, &I&, &J&, &K&, &L&, &M&, &N&, &O&, &P&, &Q&, &R&,
&S&, &T&, &U&, &V&, &W&, &X&, &Y&, &Z& };
// 字母索引哈希表
private HashMap&String, Integer& alphaI
Paint paint = new Paint();
boolean showBkg =
int choose = -1;
public QuickAlphabeticBar(Context context) {
super(context);
public QuickAlphabeticBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
public QuickAlphabeticBar(Context context, AttributeSet attrs) {
super(context, attrs);
public void init(Activity ctx) {
mDialogText = (TextView) ctx.findViewById(R.id.fast_position);
mDialogText.setVisibility(View.INVISIBLE);
mHandler = new Handler();
// 设置需要索引的列表
public void setListView(ListView mList) {
this.mList = mL
// 设置字母索引哈希表
public void setAlphaIndexer(HashMap&String, Integer& alphaIndexer) {
this.alphaIndexer = alphaI
// 设置字母索引条的高度
public void setHight(float mHight) {
this.mHight = mH
public boolean onTouchEvent(MotionEvent event) {
int act = event.getAction();
float y = event.getY();
final int oldChoose =
// 计算手指位置,找到对应的段,让mList移动段开头的位置上
int selectIndex = (int) (y / (mHight / letters.length));
if (selectIndex & -1 && selectIndex & letters.length) { // 防止越界
String key = letters[selectIndex];
if (alphaIndexer.containsKey(key)) {
int pos = alphaIndexer.get(key);
if (mList.getHeaderViewsCount() & 0) { // 防止ListView有标题栏,本例中没有
this.mList.setSelectionFromTop(
pos + mList.getHeaderViewsCount(), 0);
this.mList.setSelectionFromTop(pos, 0);
mDialogText.setText(letters[selectIndex]);
switch (act) {
case MotionEvent.ACTION_DOWN:
if (oldChoose != selectIndex) {
if (selectIndex & 0 && selectIndex & letters.length) {
choose = selectI
invalidate();
if (mHandler != null) {
mHandler.post(new Runnable() {
public void run() {
if (mDialogText != null
&& mDialogText.getVisibility() == View.INVISIBLE) {
mDialogText.setVisibility(VISIBLE);
case MotionEvent.ACTION_MOVE:
if (oldChoose != selectIndex) {
if (selectIndex & 0 && selectIndex & letters.length) {
choose = selectI
invalidate();
case MotionEvent.ACTION_UP:
choose = -1;
if (mHandler != null) {
mHandler.post(new Runnable() {
public void run() {
if (mDialogText != null
&& mDialogText.getVisibility() == View.VISIBLE) {
mDialogText.setVisibility(INVISIBLE);
return super.onTouchEvent(event);
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int height = getHeight();
int width = getWidth();
int sigleHeight = height / letters. // 单个字母占的高度
for (int i = 0; i & letters. i++) {
paint.setColor(Color.WHITE);
paint.setTextSize(20);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAntiAlias(true);
if (i == choose) {
paint.setColor(Color.parseColor(&#00BFFF&)); // 滑动时按下字母颜色
paint.setFakeBoldText(true);
// 绘画的位置
float xPos = width / 2 - paint.measureText(letters[i]) / 2;
float yPos = sigleHeight * i + sigleH
canvas.drawText(letters[i], xPos, yPos, paint);
paint.reset();
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4316863次
积分:40137
积分:40137
排名:第83名
原创:647篇
转载:81篇
评论:2634条
文章:27篇
阅读:65278
阅读:83099
阅读:63776
文章:14篇
阅读:347245
文章:11篇
阅读:181002
文章:10篇
阅读:80235
文章:13篇
阅读:40195
文章:13篇
阅读:430086
微信公众号:wwjblog
微信号:whatswwj
移动开发者狂热群:注明入群理由,里面有一群热爱分享的开发者
高品质课堂推荐:
(2)(1)(1)(1)(2)(2)(1)(3)(3)(2)(3)(5)(9)(3)(5)(2)(2)(2)(8)(5)(10)(3)(2)(3)(4)(12)(1)(5)(5)(6)(7)(2)(12)(11)(11)(8)(14)(10)(16)(8)(15)(23)(13)(12)(12)(11)(17)(28)(18)(20)(8)(11)(20)(13)(14)(10)(23)(18)(15)(36)(27)(47)(16)(3)(28)(33)(14)(13)
从入门到成长到成熟再到优秀,大多数程序员走了前面一段相似的道路,而有些人却走得更远一些!!!!  兰溪做假英语等级证书【电╆微信136.】【全.国.货.到.付.款】【本.地.送.货.上.门】【诚.信.第.一】【顺.丰.快.递】【诚.信.保.密】,行业顶尖品质,包您满意。.
<div class="left_zw"
/business//
  楚天金报讯 (记者彭岚 通讯员李莹、孙念)骑行在街头,电瓶车突然没电了会不会很无助?好消息来了,即日起,武汉800余个运营中的公共自行车站点将陆续启动充电服务,可为电动车和手机“补给”电量。
  昨日,武汉环投公共自行车公司透露,目前汉口300个站点已增设了便民插座,实现了站点充电服务功能。按照计划,本月底汉口片所有公共自行车站点都将实现充电功能。武昌的站点设备改造正在进行中,将在5月底完成。
  记者昨日在兴业路上一公共自行车站点看到,增设的充电桩上有两个插座,但没有充电线(如右图),这意味着,无论是手机还是电动车,市民充电需自带插头和充电线。
  目前,充电费用为1元充电10分钟。已办理公共自行车租车卡的用户,可直接使用卡内预充值刷卡充电。操作流程比较简单,在中控柜上插入卡片,根据屏幕提示,选择确定充电后,插好插头即可充电。充电时,充电接口旁将显示剩余充电时间,当时间为0时即表示充电完成。
  据悉,后期运营公司还将完成微信端、APP端充电功能的添加,实现线上充电及缴费充值业务,并计划发行专用充电卡。
  之前只有安卓版的公共自行车租车客户端“江城易单车”,本月底将启动方便iPhone手机用户使用的客户端,iPhone用户也可享受手机租车服务了。
:天主教与东正教领袖将举行千年来首次会面:
:沙特:瑞士将代管其在伊朗领事业务|伊朗|囚犯:
:解放军054A舰南海救援中国渔船 避免100万元损失:
:回家被逼婚,有招儿了_《知识就是力量》杂志:
:警惕偷走你健康的“贼”,也许你正在遇见ta!_《知识就是力量》杂志:
:中国军费实际支出大于官方公布数字?国防部回应|国防费|国防部:
:台湾“不当党产处理条例草案”交付审查|条例|草案:
:李登辉称钓鱼岛属于日本 马英九办公室批“丧权辱国”:
:如何鉴别陈年老茶的年份_普洱茶之家:
:为何有人在朋友圈里晒晒晒,有人却潜潜潜?_《知识就是力量》杂志:
:火箭军女兵分队大漠演练 发射新型导弹画面曝光:
:美国民主党初选:希拉里首战险胜桑德斯:
:专家:萨德入韩是大势所趋 美反复只为敲诈中国:
:国防部:韩部署萨德损害中国战略安全 表严重关切:
:海昏侯墓留下五大未解之谜(图):
:印度空军雇员中“美人计”:向巴方出卖海量情报:
:周乃翔曲福田履新苏州市委正副书记|入党|组织部:
百度新闻源&& 22:57
    编辑:
[] [] [] []
[] [] [] [][] []
网站:(022) 转 9008 
电台办公室: 
电台总编室:
本网站由天津人民广播电台版权所有,技术支持
Copyright 2003 - 2011All Rights Reserved怎样查手机短信记录删除恢复江西删除短信查询_百度_经验!!!
“全球首恶”引渡美国 曾发动贩毒战争致数万人死亡
  怎样查手机短信记录删除恢复江西删除短信查询★★★黑客徽信:cm8314★★★专业查询恢复微信聊天记录丨开房记录丨同住人信息丨手机通话记录丨手机短信内容丨全家户籍丨机主信息丨手机定位丨破解QQ微信密码丨复制sim卡丨各种监控软件等等丨保密丨信誉丨安全丨目前只有他会丨找他门你唯一选择丨是你值得信赖的首选!!
:2016年令计划、郭伯雄等48名原省部级以上干部被提起公诉
: 2016年巡视工作综述:“尖兵”显神勇 “利剑”展锋芒
:“打虎拍蝇猎狐”:铁腕反腐交出沉甸甸的成绩单
: 墨西哥大毒枭古兹曼被引渡美国 或面临终身监禁
: 马前总理煽仇华情绪称中资“抢饭碗” 中使馆怒批:别有用心
: 印度又爆性侵惨案:12岁少女遭校长与3老师集体性侵
: 俄罗斯发生4.0级地震 震源深度15千米
: 2016年,广东1004人因“为官不为”遭党政纪处分
: 贵州省政协委员选举前收看辽宁拉票贿选警示片
: 冈比亚危机解决 前总统贾梅乘机离国 开始流亡生涯
: 日媒:安倍迎特朗普时代 日美同盟走向岔路口
: 四川省法院:李佳获刑14年何华章获刑8年半
: 过去三年习主席的新年贺词透露了什么?你都看懂了吗?
百度新闻源&& 01:47:54
    编辑:
[] [] [] []
[] [] [] [][] []
网站:(022) 转 9008 
电台办公室: 
电台总编室:
本网站由天津人民广播电台版权所有,技术支持
Copyright 2003 - 2011All Rights Reserved
: 宜家否认在华召回“问题柜” 最终处理方案今公布
新闻中心重点栏目
新闻中心创新实验室
南方网官方微信
微信订阅号
——陈光标回应举钱合影做V字手势
——郑州市长痛批干部养尊处优}

我要回帖

更多关于 总资产报酬率 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信