收藏 分销(赏)

android 开发指南.ppt

上传人:s4****5z 文档编号:14018912 上传时间:2026-05-28 格式:PPT 页数:140 大小:3.22MB 下载积分:10 金币
下载 相关 举报
android 开发指南.ppt_第1页
第1页 / 共140页
android 开发指南.ppt_第2页
第2页 / 共140页


点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Android-,前言,3G(,3rd Generation-,第三代数字通信,),3G,是指将,无线通信,与,国际互联网,等多媒体通信结合的新一代移动通信系统,.3G,只是一种通信技术标,准,符合这个标准的技术有,WCDMA,CDMA2000,TD-SCDMA,三种无线接口标准,.,中国联通,:,使用的是,WCDMA,(世界上大部分,3G,网络都采用的是该标准,;,中国电信,:,使用的是,CDMA2000(,日,韩和北美使用,);,中国移动,:,使用的是具有自主知识产权的,TD-SCDMA(,只有中国才使用,).,相对第一代模拟制式手机,(1G),和第二代,GSM,CDMA,等数字手机,(2G),3G,手机能处理图像,音乐,视频等,多种媒体形式,提供包括网页浏览,电话会议,电子商务等多种信息服务,.,3G,网络与前两代的主要区别是在,传输声音和数据的速度上,有很大的提升,.,目前中国正在建设,3G,网络,大城市的,3G,网络基本上已经铺设好,像北京铺设好了超过,2000,个基站,深圳铺设了,1000,多个基站,.,但是要全民普及到,3G,手机尚且需要几年时间。现在,大家使用的手机大多,还是,2.5G,手机,符合,2.5G,网络的接口标准有,CDMA2000 1X,和,GPRS,中国联通使用的是,CDMA2000 1X,标准,中国移动使用的是,GPRS,标准,.,目前,我们可以把,2.5G,移动通信技术看作是,2G,迈向,3G,的衔接性技,术,在,2.5G,网络下出现了如,WAP,、蓝牙,(,Bluetoot,),等技术,.,Android-,概览,Android,是基于,Linux,内核的软件平台和操作系统,,是,Google,在,2007,年,11,月,5,日公布的手机系统平台,,早期由,Google,开发,后由开放手机联盟(,Open,Handset Alliance,)开发。它采用了软件堆层,(,software stack,,又名以软件叠层)的架构,,主要分为三部分。低层以,Linux,内核工作为基础,,只提供基本功能;其他的应用软件则由各公司自行开,发,以,Java,作为编写程序的一部分。之后,Android,提,供了,NDK,以供开发者使用其他语言编写程序。另外,为,了推广此技术,,Google,和其他几十个手机公司创建了,开放手机联盟。,Android,在未公开之前常被传闻为,Google,电话或,gPhone,。大多传闻认为,Google,开发的,是自己的手机电话产品,而不是一套软件平台。到了,2010,年,1,月,,Google,始发表自家品牌手机电话的,Nexus One,。,Android-,概览,升级,Android,系统今后将继续每半年一次的升级步伐,分别定在每年的夏天和年终。每代,Android,系统都,将以甜点命名,.,比如,:,1.5,版叫做,Cupcake,(纸杯蛋糕),1.6,版为,Donut,(甜甜圈),2.1,版的,clair,(闪电泡芙,一种法式奶油夹心甜点),此版本曾被叫做,Flan“,水果馅饼”,之后是,2.2,版的,Froyo,(冻酸奶,),2.3,版的,Gingerbread,(姜饼),.,以,CDEFG,字头顺序排列,.Donut,将把社交网络功能作为升级重点,在,手机的各种体验中,都增加社交,网络元素,7.,对手机业界的影响,已经与,HTC,、,NTT,DoCoMo,、,KDDI,、,Motorola,等世界通信领域,34,家公司于免费提供达成一致。今后,对于移动通信的影响势必会进一步体现出来。但是如此广泛公司的同盟是否能够有效运作及以持久值,得拭目以待。,Android-,概览,android,和自身,-,消费市场的开源挑战,Android的最大的挑战是开源,android,可能永远是开源项目,为了成功必须要销售数百万台,它,不是第一个开源手机,但是,google,领衔移动市场的开始,.,开源是双刃剑,有着大量的人才和公司资源,.,但另一方面,代码不集中,就像分裂的,linux,一样,.,授权,android,android,以两种不同的开源许可发布,.,linux,内核是,GPL,发布,开源,os,需要该授权,.android,平台,(,不含内核,),由,apache,发布,.,两种发布模式都是开源为主,不同是后者面向商业用途,.,Android-,概览,堆栈式,android,Android-,概览,探索,android,构建于,linux,内科,高级优化的,java,程序的虚拟机上,.,linux,内核负责硬件部分处理,java,环境提,供了软件环境更易于编程和,ui,的设计,.,构建于,linux,内核,大量的开发人员可提供平台的发展,内核比较成熟性能非常稳定,.,linux,提供了硬件抽象层,使得底,层变化不至于引发上层变动,.,运行于,Dalvik,虚拟机上,出于对效率的需要,java,语言的流行性提供了丰富的应用平台,.android,不是,j2me,平台,(,涉及,sun,的,jvm,授权,),编码环境是,java,编译成字节码,再翻译成类似但不同的,dex,文件,.,这些文件运行于,google,提供的自己的虚拟机,(,dalvik).android,程序运行在,dalvik,内,依赖于,linux,内核,比如,进程,内存,文件系统管理等,.,启动,android,开发,核心是,intent(,意图,),描述的想要做什么,(,类似于,action).,intent,移动市场重在简化操作,intent,刚好满足这点,.,intent,是需求的声明,intentFilter,提供了,intent,的辅助功能,intent,有描述,action,或服务的信息构成,interntFilter,过滤哪些意图可以提供服务,Android-,概览,intent,action,通常是动词,有内置的,也可自定义,.,Android-,概览,激活,android,activity,本质上就是,UI,一个应用会包含多个,activity,每个活动包含多个视图,.,public class activity1 extends Activity,public void,onCreate(Bundle,icicle),super.onCreate(icicle,);,setContentView(R.layout.main,);,Android-,开发环境,android,sdk,Android-,开发环境,android DDMS,透视图,Android-,开发环境,android DDMS,透视图,Android-,开发环境,命令行工具,set path=%,path%;c:softwaregoogleandroidsdktools;/windows,export path=$PATH:/,path_to_Android_SDK_directory,/tools,/,linux,Android Debug Bridge(,adb,),Android-,开发环境,命令行工具,连接到第一个模拟器会话,adb,-d 1 shell,Android-,开发环境,命令行工具,adb,shell install,someapplication.apk,/,安装,adb,shell,rm,/data/app/Chapter2.apk/,卸载,telnet,localhost,5554/telnet,连接到模拟器控制台,注,:,模拟器运行监听于端口,(5555),则控制器就是,5554(-1).,Android-,开发环境,eclipse,下构建,android,应用,向导,Android-,开发环境,eclipse,下构建,android,应用,样例代码,:,src,文件夹,xxx.java,R.java,android.jar,res,文件夹,drawables,layout,values,AndroidMenifest.xml,Android-,开发环境,eclipse,下构建,android,应用,Button,button,=(Button),findViewById(R.id.calculate,);#9,button.setOnClickListener(new,Button.OnClickListener,().,Log.i(tag,onClick,invoked.);,/,记载日志,mealpricefield.getText().toString,(),/,提取文本,answerfield.setText(answer,);,/,设置文本,构建应用程序,Android-,开发环境,构建应用程序,apk,文件可用,rar,工具打开,android,模拟器,皮肤,:,代表不同的硬件布局,.,网络速度,:,移动开发的重要因素,需要可靠地网络连接,.,模拟器提供了丰富的网络条件和速度,.,Android-,开发环境,android,模拟器,注,:,模拟器和仿真器都是用于不需要实物进行测试应用,.,仿真器在源代码级别上进行兼容,不能保证目标代码在真实设备中可用,.,模拟器环境中项目的目标是在二进制的级别上兼容的,缩写代码就和在实物上运行一样,包括网络延迟和稳定性,.,android,包含,emulator.exe,程序运行模拟器,同时也包含很多选项来自定义仿真器环境,.,仿真器描述文件,:,Android-,开发环境,UI,activity,是精髓,在所有,应用程序的生命周期中扮,演重要角色,.,不允许随意,夺取控制权,android,提供了生命周期以备按照,需要进入,/,退出进程,.,如何,开始 停止 暂停,继续重要,.,activity,由许多,view,组成,.,视图是与之交互的界面,.,Android-,显示单位,px,(pixels),像素,一般,HVGA,代表,320 x480,像素,这个用的比较多。,dip,或,dp,(device independent pixels),设备独立像素,这个和设备硬件有关,一般为了支持,WVGA,、,HVGA,和,QVGA,推荐使用这个,不依赖像素。,sp(scaled pixels best for text size),比例像素,主要处理字体的大小,可以根据系统的字体自适应。,除了上面三个显示单位,下面还有几个不太常用:,in(inches),英寸,mm(millimeters),毫米,pt(points),点,,1/72,英寸,为了适应不同分辨率,不同的像素密度,推荐使用,dip,,文字使用,sp,。,Android-,helloworld,public class,MainActivity,extends Activity,onCreate,().,AndroidManifest.xml,Android-,拨打电话与发送短,1.,打电话,Intent,intent,=new Intent();,intent.setAction(,Intent.ACTION_CALL,);,intent.setData(Uri.parse(,tel,:+,phoneNo,);,2.,发送短信,SmsManager,mng,=,SmsManager.getDefault,();,String,msg,=hello;,mng.sendTextMessage(5554,null,msg,null,null,);,Toast.makeText(Context,1).show();,注,:,Toast,通知可以改变通知位置,.,toast.setGravity(Gravity.TOP|Gravity.LEFT,0,0);,Android-,吐司处理,/Toast,通知可以改变通知位置,.,toast.setGravity(Gravity.TOP|Gravity.LEFT,0,0);,/,自定义吐司,Toast,toast,=new,Toast(getApplicationContext,();,toast.setGravity(Gravity.CENTER_VERTICAL,0,0);,toast.setDuration(Toast.LENGTH_LONG,);,/,布局文件,layout.xml,toast.setView(layout,);,toast.show,();,Android-,单元测试,.,public class,XMLTest,extends,AndroidTestCase,public void,testSomething,()throws,Throwable,Log.i(Test,this is test,日志,);,System.out.println(ddd,);,Assert.assertTrue(1+1=3);,Android-,数据存储,1.,内部存储,FileOutputStream,fos,=,context.openFileOutput(itcast.txt,MODE,);,MODE:,Context.MODE_PRIVATE,=0,Context.MODE_APPEND,=32768,Context.MODE_WORLD_READABLE,=1,Context.MODE_WORLD_WRITEABLE,=2,默认文件位置,:/data/data/,files,FileInputStream,fis,=,Context.,openFileInput,(xxx.txt,);,new,FileInputStream(new,File(/data/data/,cn.itcast.xxx/./kk.txt,);,context.getCacheDir,(),/data/data/cache,context.getFilesDir,(),/data/data/files,createPackageContext(“xx.xx.xxx”).openFileInput,(.),Android-SD,卡读写,1.,通过,adb,命令创建,sk,卡,adb,shell,mksdkcard,50m,d:xxxxxxx.img,挂载,/,卸载,sd,卡,if(Environment.,getExternalStorageState,(),.,equals(Environment.MEDIA_MOUNTED,),File,sdCardDir,=,Environment.getExternalStorageDirectory,();,File,saveFile,=new,File(sdCardDir,itcast.txt,);,FileOutputStream,fos,=new,FileOutputStream(saveFile,);,.,Android-Sax,解析,Xml,1.Sax,1.1startDocument(),文档开始,1.2endDocument(),文档结束,1.3,startElement(String,namespaceURI,String,localName,String,qName,Attributes,atts,),元素开始,qname,是元素名,1.4,endElement(String,uri,String,localName,String name),事件,1.5,characters(char,ch,int,start,int,length),SAXParserFactory,spf,=,SAXParserFactory.newInstance,();,/,工厂,SAXParser,saxParser,=,spf.newSAXParser,();,/,解析器,/,XMLContentHandler,extends,DeafaultHandler,.,XMLContentHandler,handler=new,XMLContentHandler,();,saxParser.parse(inStream,handler);,inStream.close,();,return,handler.getPersons,();,/*,*,每当遍历到文本节点时,会触发该事件,*,/,public void,characters(char,ch,int,start,int,length),Android-Dom,解析,Xml,2.Dom,DocumentBuilder,builder=,DocumentBuilderFactory,.newDocumentBuilder,();,Document,dom,=,builder.parse(inStream,);,Element root=,dom.getDocumentElement,();,NodeList,items=,root.getElementsByTagName(person);/查找所有person节点,for(.),node=.,(,Element)node).getAttribute(id,);,if(node.getNodeType,=,Node.ELEMENT_NODE,),.,/*,*,取得文本节点,*/,node.getTextContent,(),Android-Pull,解析,Xml,3.Pull,Android内置的Pull解析器解析XML文件.Pull解析器是一个开源的java项目,既可以用于,android,也可以用于JavaEE.如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件.android系统本身使用到的,各种xml文件,其内部也是采用Pull解析器进行解析的.Pull解析器的运行方式与,SAX,解析器,相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个,元素并触发相应事件.跟SAX不同的是,Pull解析器产生的事件是一个数字,而非方法,因此可以,使用一个switch对感兴趣的事件进行处理.当元素开始解析时,调用,parser.nextText(),方法可,以获取下一个Text类型节点的值,.,XmlPullParser,parser=,Xml.newPullParser,();,parser.,setInput,(inStream,UTF-8);,int,etype,=,parser.getEventType,();,while(,etype,!=,XmlPullParser.END_DOCUMENT,),switch(,etype,),case,XmlPullParser.START_DOCUMENT,:,parser.getName,();,case,XmlPullParser.START_TAG,:,etype,=,parse.next,();,Android-,sharedpreference,轻量级的数据存储机制,适合存储软件配置参数,.,内部仍然是使用,xml,进行存储,.,位于,/data/data/,shared_prefs,.,SharedPreferences,sf,=,getSharedPreferences(,itcast,Context.MODE_PRIVATE,);,Editor,editor,=,sharedPreferences.,edit,();/获取编辑器,editor.putString(name,传智播客,);,editor.putInt(age,4);,mit();,/提交修改,注,:,文件名不需要加扩展名,.,自动加上,.,/,格式如下,:,传智播客,/,读取数据,String name=,sharedPreferences.getString(name,);,int,age=,sharedPreferences.getInt(age,1,);,Android-,sharedreference,访问其他包中的共享首选项,:,Context,otherAppsContext,=,createPackageContext,(cn.itcast.action,Context.CONTEXT_IGNORE_SECURITY,);,SharedPreferences,sharedPreferences,=,otherAppsContext.getSharedPreferences(itcast,Context.MODE_WORLD_READABLE,);,或者,直接通过绝对路径,new File(/data/data/$,otherpackagename/shared_prefs/kk.xml,);,Android-,使用嵌入式,SQLite,Android平台上集成,的,一个嵌入式关系型数据库,SQLite3支持 NULL,INTEGER,REAL(浮点数,字),TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上,sqlite3也接受varchar(n),char(n),decimal(p,s)等数据类型,只不过在运算或保存时会转,成对应的五种数据类型.,SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是,什么,.,但定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数以外,的数据时,将会产生错误.,另外,SQLite在解析CREATE TABLE语句时,会忽略字段名后面的数据类型信息,.,SQLite可以解析大部分标准SQL语句,如:,查询语句:select*from,.where,group by,.,.,having.order by 排序子句,S,QLite,分页同,mysql,相同,:,.,.,limit 5 offset 3,|,limit 3,5,Android-,使用嵌入式,SQLite,首次使用数据库需要创建表及初始化一些信息,升级时需要修改表信息,android,提供了抽象类,SQLiteOpenHelper,完成此类功能,.,onCreate(SQLiteDatabase,db),方法用于首次使用时创建库,onUpgrade(SQLiteDatabase,db,int,oldVersion,int,newVersion,),方法检测版本,发生变化时更新库,.,getWritableDatabase,(),和,getReadableDatabase,(),方法均获取一个用于操作数据库的,SQLiteDatabase,实例,.,getWritableDatabase,(),方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能,读而不能写,.,倘若使用,getWritableDatabase,(),打开数据库就会出错,.,getReadableDatabase,(),方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试,以只读方式打开数据库,.,Android-,使用嵌入式,SQLite,public class,DatabaseHelper,extends,SQLiteOpenHelper,private static final String name=,itcast,;/,数据库名称,private static final,int,version=1;/,数据库版本,public,DatabaseHelper(Context,context),super(context,name,null,version);,public void,onCreate(SQLiteDatabase,db),/drop table if exists customers,/create table if not exists customers(.,db.execSQL(CREATE,TABLE IF NOT EXISTS person(,personid,integer primary key,autoincrement,name varchar(20),age INTEGER);,public void,onUpgrade(SQLiteDatabase,db,int,oldVersion,intnewVersion,),db.execSQL,(ALTER TABLE person ADD phone VARCHAR(12)NULL);,在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数据库中的数据丢失,.,Android-,使用嵌入式,SQLite,使用,SQLiteDataBase,数据库,SQLiteDatabase,db=.;,db.execSQL(insert,into,person(name,age,),values(?,?),new,Object.);,db.close,();,/,查询操作,Cursor,cursor,=,db.,rawQuery,(select,*from person,null);,while(,cursor.moveToNext,(),int,personid,=cursor.getInt(0);,String name=cursor.getString(1);,int,age=cursor.getInt(2);,cursor.close,();,db.close,();,SQLiteDatabase,db=,databaseHelper.getWritableDatabase,();,ContentValues,values=new,ContentValues,();,values.put(name,传智播客,);,.,long,rowid,=,db.insert,(person,null,values);/,Android-,使用嵌入式,SQLite,/,删除,SQLiteDatabase,db=,databaseHelper.getWritableDatabase,();,db.,delete,(person,personid,sqlite3 data/data/,cn.itcast.android,/databases/android,sqlite,.tables|.schemas|.help|.,exit(.quit,)|select*,.,nullvalue,NULL,/,空值数据显示问题 例,:.,nullvlaue,NULL,.,header(s,)ON|OFF,/,是否显示列头信息 例,:.headers ON,.mode MODE?table?,/,指定数据显示风格 例,:.mode column,创建表时,只能用,integer,类型,不能用,int,作为主键,否则不支持,autoincrement,.,create table,customers(id,integer primary key,autoincrement,name,text);,Android-SQLite3,工具使用,变长参数,:,即时没有指定任何值,也不为,null,而是,length=0,的数组,.,Android-,ContentProvider,使用内容供应商共享数据,.,如果直接访问磁盘文件,(,SDCard|File|SQLite,数据库,|,首选项,),需要很多底层的交互细节,但是用,该种方式,只使用,url,即可对应用程序进行访问,并统一了数据访问方式,.,public class,PersonContentProvider,extends,ContentProvider,/,在该生命周期方法中才能正确得到,Content,对象,.,public,boolean,onCreate,(),/.,public Uri,insert(,Uri,uri,ContentValues,values),.,Android-,ContentProvider,URI:,scheme:android,规定,必须是,content:/,authority:,惟一标识该供应商,.,path:,代表操纵的数据,.,/person,/person/10,/person/10/name,/,将字符串转换成,Uri,对象,Uri,uri,=Uri.parse(content:/xxxx/person/10);,Android-,ContentProvider,UriMatcher,:,使用该类,可以判断,Uri,如何哪一种模式,.,/,若不匹配,返回,UriMatcher.NO_MATCH,UriMatcher,sMatcher,=new,UriMatcher(UriMatcher.NO_MATCH,);,/,一次添加匹配的模式串,以及匹配后返回的数值,.,/$authority$path,sMatcher.addURI(cn.itcast.contentprovider,person,1);,sMatcher.addURI(cn.itcast.contentprovider,person/#,2);,switch(sMatcher.match(Uri,),case 1:,case 2:,.,/,获取,uri,后边,ID,部分的话,可以通过,Uri,uri,=,Uri.parse(content:/cn.itcast.provider.personprovider/person,),Uri,resultUri,=,ContentUris,.,withAppendedId,(uri,10);/.person/10,uri.parse(content:/cn.itcast.provider.personprovider/person/10),long,personid,=,ContentUris,.,parseId,(uri,);,Android-,ContentProvider,XxxContentProvider,extends,ContentProvider,.,/,该方法用于返回当前,Url,所代表数据的,MIME,类型,.,如果操作的数据属于集合类型,/,那么,MIME,类型字符串应该以,vnd.android.cursor.dir,/,开头,/,如,:,vnd.android.cursor.dir,/person.,/,如果要操作的数据属于非集合类型数据,那么,MIME,类型字符串应该以,/,vnd.android.cursor.item,/,开头,/,如,:,vnd.android.cursor.item,/person,public String,getType(Uri,uri,).,.,Android-,ContentProvider,使用内容解析器,(,ContentResolver,):,ContentResolver,resolver,=,getContentResolver,();,Uri,uri,=,Uri.parse(content:/cn.itcast.provider.personprovider/person,);,ContentValues,values=new,ContentValues,();,values.put(name,itcast,);,values.put(age,25);,/,插入,resolver.,insert,(uri,values);,/,查询,resolver.query(uri,null,null,null,personid desc);,/,更新,resolver.update(updateIdUri,updateValues,null,null);,/,删除,resolver.delete(deleteIdUri,null,null);,Android-,ContentProvider,监听,contentprovider,的数据变化,.,/,供应商中的,crud,方法完成后需要发出数据变更的通知,以通知那些感兴趣的监听者,.,XxxContentProvider,extends,ContentProvider,public long insert(.),.,getContext().getContentResolver().,notifyChange,(uri,null,);,内容解析器如若要对数据监听数据变更,需要使用,ContentObserver,对,uri,进行监听,收到通知后,回,调处理方法,onChange,().,context.getContentResolver().registerContentObserver,(uri,true,new,MyContentObserver(new,Handler();,class,MyContentObServer,exnteds,ContentObserver,public,MyContentObServer(Handler,handler),super(handler,);,public void,onChange,().,Android-,ContentProvider,监听用户发送,(,接收,),的短信,系统自带的短信程序发送,(,或接收,),短信时,会通过,ContentProvider,把短信保存进数据库,并且,发出一个变更通知,(,notifyChange,).,使用,ContentObserver,对数据变化进行监听,在用户发送,短信时,就会被,ContentObserver,窃听到短信,.,/,系统,Context.getContentResolver().notifyChange(content:/sms,null,);,/,客户端,:,Context.getContentResolver().registerObserver(uri,false,new,ContentObserver(new,Handler();,Cursor,cursor,=,getContentResolver().query(Uri.parse(,content:/sms/outbox,),null,cursor.getInt(cursor.getColumnIndex(_id,);,cursor.getString(cursor.getColumnIndex(address,);,cursor.getString(cursor.getColumnIndex(body,);,cursor.getLong(cursor.getColumnIndex(date,);,Android-,ContentProvider,Android-,访问通信录,1.,权限,2.,通过提供的内容供应商访问通信录,(,uri,),content:/,com.android.contacts,/contacts,操作的数据是联系人信息,Uri,content:/,com.android.contacts,/data/phones,联系人电话,Uri,content:/,com.android.contacts,/data/emails,联系人,Email Uri,android.provider.ContactsContract.RawContacts,android.provider.ContactsContract.Data,android.provider.ContactsContract.CommonDataKinds.StructuredName,android.provider.ContactsContract.CommonD
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服