版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQLite数据库相关的类与接口,相关的方法及编程访问SD卡简介访问SD卡常用方法及常量,权限设置SharedPreferences存储SharedPreferences接口,应用案例目录CONTENTS010203文件存储文件存储常见类04数据存储第9章ContentProvider实现数据共享的相关类、接口与权限05SharedPreferences存储PART.01SharedPreferences存储SharedPreferences提供了一种轻量级的数据存取方法,一般用于数据较少的配置信息的存储场合。SharedPreferences存储是以“键-值”对的方式将数据保存到一个内部的XML配置文件中。保存SharedPreferences键值对信息的文件存放在/data/data/<packagename>/shared_prefs下。<packagename>即应用项目包名。必须先启动AndroidStudio的模拟器,然后单击AndroidStudio编辑窗右下角的DeviceFileExplorer标签,才能看到DeviceFileExplorer区域中的内容。SharedPreferencesSharedPreferences存储SharedPreferences是一个接口,位于android.content.SharedPreferences包中。获取SharedPreferences对象的两种方式调用Context对象的getSharedPreferences()方法,所获得的SharedPreferences对象可以被同一应用项目下的其他组件共享。getSharedPreferences()方法的语法:Context.getSharedPreferences(Stringname,intmode);Mode指操作模式:MODE_PRIVATE,值为0,应用项目私有,常用;MODE_WORLD_READABLE,值为1,其他程序可读;MODE_WORLD_WRITEABLE,值为2,其他程序可写。调用Activity对象的getPreferences()方法,获得的SharedPreferences对象只能在该Activity中使用。获取SharedPreferences对象SharedPreferences存储使用SharedPreferences对象存储数据时,还需要使用SharedPreferences的一个内部接口SharedPreferences.Editor。SharedPreferences对象获取数据方法说明edit()返回SharedPreferences的内部接口SharedPreferences.Editorcontains(Stringkey)判断是否包含该键值getAll()从SharedPreferences中返回所有的信息getBoolean(Stringkey,booleandefValue)获得一个boolean值getFloat(Stringkey,floatdefValue)获得一个float值getInt(Stringkey,intdefValue)获得一个int值getLong(Stringkey,longdefValue)获得一个long值getString(Stringkey,StringdefValue)获得一个String值SharedPreferences存储调用SharedPreferences的edit()方法返回SharedPreferences.Editor内部接口,该接口中提供了保存数据的方法。SharedPreferences对象获取数据方法说明clear()清空SharedPreferences里的所有数据commit()当Editor编辑完成后,提交修改到SharedPreferences的XML配置文件中putBoolean(Stringkey,booleanvalue)保存一个boolean值putFloat(Stringkey,floatvalue)保存一个float值putInt(Stringkey,intvalue)保存一个int值putLong(Stringkey,longvalue)保存一个long值putString(Stringkey,Stringvalue)保存一个String值remove(Stringkey)删除SharedPreferences里指定key对应的数据项SharedPreferences存储获得SharedPreferences对象。使SharedPreferences对象处于编辑状态。即调用SharedPreferences对象的edit()方法得到内部接口SharedPreferences.Editor。保存键-值对。即使用相应的put...()方法保存键-值对。例如保存字符串型使用putString()方法。调用commit()方法提交数据,将键-值对数据写入到SharedPreferences的XML配置文件中。SharedPreferences存储的编程步骤SharedPreferences应用案例设计思路使用SharedPreferences对账号和密码的输入信息进行存取。在Activity的构造方法中读XML配置文件,如果有保存的登录信息则显示在相应位置;如果有勾选“记住我”,则在点击“登录”按钮或退出Activity时写入登录信息到XML配置文件中。【案例9.1】在用户登录界面中,增加一个复选框“记住我”。当勾选了该复选框后,系统的用户登录Activity将保存最近的一次用户登录信息。开发步骤准备图片资源。复制back.jpg作为背景图片资源到本项目的res/drawable目录中。准备字符串资源。编写res/values目录下的strings.xml文件。准备样式资源。定义了<stylename=“button”>、<stylename=“title”>、<stylename=“text”>和<stylename=“content”>等样式,用于文本的textColor、textColor和textStyle属性。设计布局,在登录界面内添加一个CheckBox控件,用于用户选择是否记录登录信息。开发逻辑代码。SharedPreferences应用案例MainActivity.java代码片段21protectedvoidonCreate(BundlesavedInstanceState){22super.onCreate(savedInstanceState);23setContentView(R.layout.activity_main);24etUid=(EditText)findViewById(R.id.etUid);25etPwd=(EditText)findViewById(R.id.etPwd);26cb=(CheckBox)findViewById(R.id.cbRemember);27checkIfRemember();//从SharedPreferences中读取用户的帐号和密码29findViewById(R.id.btnLogin).setOnClickListener(newView.OnClickListener(){30@Override31publicvoidonClick(Viewv){32uidstr=etUid.getText().toString().trim();//获得输入的帐号33pwdstr=etPwd.getText().toString().trim();//获得输入的密码34if(!uidstr.isEmpty()&&!pwdstr.isEmpty()&&cb.isChecked()){35rememberMe(uidstr,pwdstr);//存入SharedPreferences36}37//TODOsomethingforLogin38}39});}41@Override42protectedvoidonStop(){43super.onStop();44if(cb.isChecked()){45uidstr=etUid.getText().toString().trim();//获得输入的帐号46pwdstr=etPwd.getText().toString().trim();//获得输入的密码47rememberMe(uidstr,pwdstr);//存入SharedPreferences48}49}50@Override51protectedvoidonDestroy(){52super.onDestroy();53}56publicvoidcheckIfRemember(){SharedPreferencessp=getSharedPreferences(SP_INFOS,MODE_PRIVATE);58uidstr=sp.getString(USERID,null);59pwdstr=sp.getString(PASSWORD,null);60if(uidstr!=null&&pwdstr!=null){61etUid.setText(uidstr);62etPwd.setText(pwdstr);63cb.setChecked(true);64}65}68publicvoidrememberMe(Stringuid,Stringpwd){SharedPreferencessp=getSharedPreferences(SP_INFOS,MODE_PRIVATE);70SharedPreferences.Editoreditor=sp.edit();//获得Editor71editor.putString(USERID,uid);//将用户的帐号存入Preferences72editor.putString(PASSWORD,pwd);//将密码存入Preferences73mit();74}SharedPreferences应用案例运行结果(a)初始运行界面(b)选中“记住我”,再次运行界面SQLite数据库PART.02SQLite数据库Android平台中内嵌一个轻量级的、功能强大的嵌入式关系数据库SQLite,使用方便,可以用于完成各种复杂的数据处理,实现结构化的数据存储。SQLite数据库文件包含所有数据库和表,是一个单一的文件,扩展名为db。存储在项目目录的/data/data/<packagename>/databases下。在AndroidStudio的DeviceFileExplorer中可查到。在默认情况下,SQLite数据库文件属于应用项目所私有,且数据库的名字是唯一的。SQLiteSQLite数据库SQLiteDatabase类SQLiteDatabase类位于android.database.sqlite.SQLiteDatabase包中,是SQLite的数据库管理类。一个SQLiteDatabase对象代表一个数据库。在Android平台下,可以通过SQLiteDatabase类的静态方法创建或打开数据库,以及对数据库的记录进行增、删、改、查等操作。SQLiteOpenHelper类SQLiteOpenHelper类位于android.database.sqlite.SQLiteOpenHelper包中,它是一个辅助类,主要用来管理数据库的创建和版本。SQLiteOpenHelper是一个抽象类,使用时通常需要创建子类继承它,并实现两个抽象方法onCreate()和onUpgrade()。SQLite相关类与接口SQLite数据库Cursor接口Cursor位于android.database.Cursor包中,它是Android的一个非常有用的游标接口,通过Cursor可以对数据库的查询结果集进行随机的读写访问。调用SQLiteDatabase的query和rawQuery方法时,返回的都是Cursor对象,我们可以通过一条一条地查询游标的内容来遍历整个结果集。ContentValues类ContentValues类位于android.content.ContentValues包中,它存储一些键-值对,提供了数据库表的列名、数据映射信息。ContentValues的键是一个String类型的数据,对应数据库表中的列名;而其相应的值是一个基本数据类型的数据,对应数据库表中的数据。一个ContentValues对象代表数据库表的一行数据。ContentValues主要用于记录增加和更新操作。SQLite相关类与接口SQLite数据库SQLiteDatabase中常用的方法。方法参数说明openDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory,intflags)path:指定路径的数据库文件;factory:构造查询时返回的Cursor对象;flags:打开模式,模式参数包括:OPEN_READONLY、OPEN_READWRITE、CREATE_IF_NECESSARY打开或创建数据库openOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)同上相当于上面方法中第三个参数取CREATE_IF_NECESSARY的情形create(SQLiteDatabase.CursorFactoryfactory)同上创建一个内存数据库insert(Stringtable,StringnullColumnHack,ContentValuesvalues)table:数据表名称;nullColumnHack:空列的默认值;values:封装了列名和列值的Map添加一条记录delete(Stringtable,StringwhereClause,String[]whereArgs)table:数据表名称whereClause:删除条件whereArgs:删除条件值数组删除一条记录update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)table:数据表名称;values:更新列ContentValues类型键-值对;whereClause:更新条件(即where子句);whereArgs:更新条件值数组修改记录query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)table:数据表名称;columns:列名数组;selection:条件子句,相当于where;selectionArgs:条件子句,where的值数组;groupBy:分组的列名;having:分组条件;orderBy:排序的列名查询记录,其返回值为一个Cursor实例execSQL(Stringsql)sql:SQL语句执行一条SQL语句close()
关闭数据库SQLite数据库SQLiteOpenHelper中常用的方法。方法说明onCreate(SQLiteDatabasedb)创建数据库时调用onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)版本更新时调用getReadableDatabase()创建或打开一个只读数据库getWritableDatabase()创建或打开一个读写数据库SQLite数据库Cursor中常用的方法。方法说明getCount()获取游标结果集的总记录条数isFirst()判断游标是否是第一条记录isLast()判断游标是否是最后一条记录isClosed()判断游标结果集是否关闭move(intoffset)向后移动游标到指定记录moveToFirst()移动游标到第一条记录moveToLast()移动游标到最后一条记录moveToNext()移动游标到下一条记录moveToPrevious()移动游标到上一条记录getColumnIndexOrThrow(StringcolumnName)根据列名获得列索引getInt(intcolumnIndex)根据列索引获得int类型值getString(intcolumnIndex)根据列索引获得String类型值SQLite数据库创建数据库如果要在/data/data/ee.example.activity_abc/databases目录下创建一个名为pocketblog.db的数据库,可使用方法:openOrCreateDatabase("/data/data/ee.example.activity_abc/databases/pocketblog.db",null);创建数据表创建一个数据表UserTb,其属性列为:uid(主键并且自动增加)、uname(用户名)、upsw(密码),可使用代码:Stringsql="CreatetableUserTb(uidintegerprimarykeyautoincrement,unametext,upswtext)";db.execSQL(sql);//db是指定的数据库对象SQLite相关操作SQLite数据库插入数据分别使用execSQL()方法和insert()方法来完成向数据表UserTb插入记录:Stringsql="insertintoUserTb(uname,upsw)values('user01','123')";db.execSQL(sql);//执行SQL语句,向db的数据表UserTb中插入一条记录或ContentValuesmycv=newContentValues();mycv.put("uname","user01'");mycv.put("upsw","123'");db.insert("UserTb",null,mycv);//向db的数据表UserTb中插入一条记录SQLite相关操作SQLite数据库删除数据和插入数据类似,使用两种方法来实现删除数据表UserTb中的记录:Stringsql="deletefromUserTbwhereuid=2";db.execSQL(sql);//执行SQL语句,在db的数据表UserTb中删除uid为2的记录或StringwhereClause="uid=?";String[]whereArgs={String.valueOf(2)};db.delete("UserTb",whereClause,whereArgs);//在db的数据表UserTb中删除uid为2的记录
这里,String.valueOf()是将其他基本数据类型转换成String的静态方法。例如:String.valueOf(2)是将数值2转换成字符串值“2”。SQLite相关操作SQLite数据库修改数据和插入或删除数据类似,使用两种方法来实现修改数据表UserTb中的记录:Stringsql="updateUserTbsetupsw=666whereuid=1";db.execSQL(sql);//执行SQL语句,在db的数据表UserTb中修改uid为1的记录或ContentValuesnewvalue=newContentValues();newvalue.put("upsw","666");StringwhereClause="uid=?";String[]whereArgs={String.valueOf(1)};db.update("UserTb",newvalue,whereClause,whereArgs);//在db的数据表UserTb中修改uid为1的记录SQLite相关操作SQLite数据库查询数据查询数据方法将返回一个Cursor对象,这里存放的是查询数据表的结果集。例如要查询UserTb中uid大于5的用户信息,可使用代码段:Cursorqc=db.query("UserTb",null,"uid=?",newString[]{String.valueOf(5)},null,null,null);if(qc.moveToFirst()){//判断游标是否为空
for(inti=0;i<qc.getCount();i++){//遍历游标
qc.move(i);intuserid=qc.getInt(0);//获得用户idStringusername=qc.getString(1);//获得用户名
Stringuserpassword=qc.getString(2);//获得用户密码
System.out.println(userid+":"+username+","+userpassword);//在屏幕上显示用户id,用户名和密码
}}SQLite相关操作SQLite应用案例设计思路本例通过SQLiteOpenHelper来实现对数据库进行创建及增、删、改的操作,对数据结构及其初始化用一个独立的代码文件实现。使用ListView对数据库的信息进行展示,并在每一条信息后增加删除按钮。每一个删除按钮对应的一条数据记录做删除操作。【案例9.2】对某商家顾客信息进行管理,要求把VIP用户信息存储到数据库中,并且实现对数据库中信息的浏览和删除。开发步骤数据库设计。在本项目中只设计与日志相关的数据表。准备颜色资源。编写colors.xml文件,分别声明black、white、grey、darkgrey、red和blue这些颜色。准备图片和背景资源。复制back.jpg作为背景图片资源到本项目的res/drawable目录中。在该目录中,还使用XML文件定义了文本输入框的背景样式、文本框各种状态的样式。设计布局,本项目至少有三个Activity。activity_main.xml设计主Activity,activity_sqlite_write.xml设计写入数据库Activity,activity_sqlite_read.xml设计浏览和删除数据库信息的Activity。开发数据库管理操纵代码。需要开发与数据库管理与操纵相关的类。开发逻辑代码。本案例有三个Activity,必须有三个类实现代码。SQLite应用案例在该项目中,命名数据库名为customerserve,命名数据表名为user_info。列名类型默认值是否为空说明u_idinteger0NotNull用户ID,主键,自增u_namevarchar“”NotNull用户姓名u_ageinteger0NotNull用户年龄u_sexintegertrueNotNull用户性别buy_creditslong0lNotNull用户积分buy_totalsfloat0.0fNotNull用户总消费金额update_timevarchar“”NotNull更新时间u_phonevarchar“”
用户电话号码u_passwordvarcjar“”
用户密码SQLite应用案例editext_selector.xml1<?xmlversion="1.0"encoding="utf-8"?>2<selectorxmlns:android="/apk/res/android">3<item4android:state_focused="true"5android:drawable="@drawable/shape_edit_focus"/>6<item7android:drawable="@drawable/shape_edit_normal"/>8</selector>1<?xmlversion="1.0"encoding="utf-8"?>2<shapexmlns:android="/apk/res/android">3<solidandroid:color="@color/white"/>4<stroke5android:width="1dp"6android:color="@color/blue"/>7<corners8android:bottomLeftRadius="5dp"9android:bottomRightRadius="5dp"10android:topLeftRadius="5dp"11android:topRightRadius="5dp"/>12<padding13android:bottom="2dp"14android:left="10dp"15android:right="10dp"16android:top="2dp"/>17</shape>shape_edit_focus.xmlSQLite应用案例数据表结构类1packageee.example.activity_sqlitedatabase.bean;3publicclassUserInfo{4publicintuserid;5publicStringname;6publicintage;7publicbooleansex;8publiclongcredits;9publicfloattotals;10publicStringupdate_time;11publicStringphone;12publicStringpassword;14publicUserInfo(){15userid=0;16name="";17age=0;18sex=true;19credits=0l;20totals=0.0f;21update_time="";22phone="";23password="";24}25}在项目包中创建一个bean目录,在其下创建一个名为UserInfo.java的代码文件。该代码文件主要是定义一个数据库表的数据结构类,并在构造方法中对数据进行初始化。SQLite应用案例数据表管理类代码:MyDBHelper.java代码片段14publicclassMyDBHelperextendsSQLiteOpenHelper{68@Override69publicvoidonCreate(SQLiteDatabasedb){70Log.d(TAG,"onCreate");Stringdrop_sql="DROPTABLEIFEXISTS"+TABLE_NAME+";";72Log.d(TAG,"drop_sql:"+drop_sql);73db.execSQL(drop_sql);Stringcreate_sql="CREATETABLEIFNOTEXISTS"+TABLE_NAME+"("+"u_idINTEGERPRIMARYKEYAUTOINCREMENTNOTNULL,"+"u_nameVARCHARNOTNULL,"+"u_ageINTEGERNOTNULL,"+"u_sexINTEGERNOTNULL,"+"buy_creditsLONGNOTNULL,"+"buy_totalsFLOATNOTNULL,"+"update_timeVARCHARNOTNULL,"+"u_phoneVARCHAR,"+"u_passwordVARCHAR"+");";75Log.d(TAG,"create_sql:"+create_sql);76db.execSQL(create_sql);77}100publiclonginsert(ArrayList<UserInfo>infoArray){102for(inti=0;i<infoArray.size();i++){103UserInfoinfo=infoArray.get(i);104ArrayList<UserInfo>tempArray=newArrayList<UserInfo>();106if(!=null&&.length()>0){107Stringcondition=String.format("u_name='%s'",);108tempArray=query(condition);109if(tempArray.size()>0){110update(info,condition);111result=tempArray.get(0).userid;112continue;113}114}116ContentValuescv=newContentValues();117cv.put("u_name",);118cv.put("u_age",info.age);119cv.put("u_sex",info.sex);120cv.put("buy_credits",info.credits);121cv.put("buy_totals",info.totals);122cv.put("update_time",info.update_time);123cv.put("u_phone",info.phone);124cv.put("u_password",info.password);125result=mDB.insert(TABLE_NAME,"",cv);127if(result==-1){128returnresult;129}130}131returnresult;132}SQLite应用案例SQLiteWriteActivity.java代码片段publicclassSQLiteWriteActivityextendsimplementsOnClickListener{28protectedvoidonCreate(BundlesavedInstanceState){29super.onCreate(savedInstanceState);30setContentView(R.layout.activity_sqlite_write);31et_name=(EditText)findViewById(R.id.et_name);32et_age=(EditText)findViewById(R.id.et_age);33et_credits=(EditText)findViewById(R.id.et_credits);34et_totals=(EditText)findViewById(R.id.et_totals);35findViewById(R.id.btn_save).setOnClickListener(this);ArrayAdapter<String>typeAdapter=newArrayAdapter<String>(this,R.layout.item_select,typeArray);38typeAdapter.setDropDownViewResource(R.layout.item_dropdown);39Spinnersp_bemale=(Spinner)findViewById(R.id.sp_bemale);40sp_bemale.setPrompt("请选择性别");41sp_bemale.setAdapter(typeAdapter);42sp_bemale.setSelection(0);sp_bemale.setOnItemSelectedListener(newTypeSelectedListener());44}47classTypeSelectedListenerimplementsOnItemSelectedListener{48publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){49bemale=(arg2==0)?true:false;50}51publicvoidonNothingSelected(AdapterView<?>arg0){}53}69publicvoidonClick(Viewv){70if(v.getId()==R.id.btn_save){71Stringname=et_name.getText().toString();74Stringtotals=et_totals.getText().toString();75if(name==null||name.length()<=0){76showToast("请先填写姓名");77return;78}87if(totals==null||totals.length()<=0){88showToast("请先填写购买总额");89return;90}91 92UserInfoinfo=newUserInfo();93=name;94info.age=Integer.parseInt(age);95info.sex=bemale;96info.credits=Long.parseLong(credits);97info.totals=Float.parseFloat(totals);info.update_time=DateUtil.getNowDateTime("yyyy-MM-ddHH:mm:ss");99mHelper.insert(info);100showToast("数据已写入SQLite数据库");101}102}SQLite应用案例SQLiteReadActivity.java代码片段69privateArrayList<HashMap<String,String>>getData(){ArrayList<HashMap<String,String>>listItem=newArrayList<HashMap<String,String>>();71Stringdesc;72ArrayList<UserInfo>uArray=readSQLite();73setTitle(String.format("数据库查询到%d条记录,详情如下:",uArray.size()));75for(inti=0;i<uArray.size();i++){76HashMap<String,String>tvitem=newHashMap<String,String>();77desc="";78UserInfoinfo=uArray.get(i);79desc=String.format("第%d个用户:",i+1);80desc=String.format("%s\n姓名:%s",desc,);81desc=String.format("%s\n年龄:%d",desc,info.age);82if(info.sex)83desc=String.format("%s\n性别:男",desc);84else85desc=String.format("%s\n性别:女",desc);86desc=String.format("%s\n积分:%d",desc,info.credits);87desc=String.format("%s\n购买总额:%8.2f",desc,info.totals);88desc=String.format("%s\n更新时间:%s",desc,info.update_time);89tvitem.put("ItemId",String.valueOf(info.userid));90tvitem.put("ItemText",desc);91listItem.add(tvitem);92}93returnlistItem;94}103privateclassMyAdapterextendsBaseAdapter{publicViewgetView(intposition,ViewconvertView,ViewGroupparent){144HashMap<String,String>map=datas.get(position);147holder.text.setText(map.get("ItemText"));149holder.btn.setFocusable(false);150holder.btn.setTag(String.valueOf(position));151holder.btn.setOnClickListener(152newView.OnClickListener(){153@Override154publicvoidonClick(Viewv){155intposition=Integer.parseInt((String)v.getTag());String[]whereArgs={datas.get(position).get("ItemId")};157myHelper.closeLink();158myHelper.openWriteLink();159myHelper.delete("u_id=?",whereArgs);161myHelper.closeLink();162myHelper.openReadLink();163datas=getData();//重新获取数据164notifyDataSetChanged();//刷新ListView165}166});167returnconvertView;168}169}SQLite应用案例运行结果(a)初始运行界面(b)写入数据库界面(c)读取数据库界面(d)查看数据库文件访问SD卡简介PART.03访问SD卡Android在应用编程中,是通过Environment类来访问SD卡上的信息。Environment类位于在android.os.Environment包中,是专门提供访问环境变量的类。方法说明getDataDirectory()返回File,获取Android数据目录getDownloadCacheDirectory()返回File,获取Android下载/缓存内容目录getExternalStorageDirectory()返回File,获取外部存储目录即SD卡目录,Android10(API29)废弃getExternalStoragePublicDirectory(Stringtype)返回File,取一个高端的公用的SD卡指定类型目录的路径,Android10(API29)废弃getExternalStorageState()返回File,获取SD卡的当前状态,如是否存在,是否可读写getRootDirectory()返回File,获取Android的根目录getExternalStorageDirectory().getFreeSpace()判断SD卡剩余可用空间,Android10(API29)废弃Environment类访问SD卡Environment类包含了大量的系统状态常量。getExternalStorageState()是获取SD卡存储状态方法,由其返回的状态常量。常见的状态常量常量名常量值说明MEDIA_BAD_REMOVALbad_removalSDCard被卸载前己被移除MEDIA_CHECKINGchecking正在磁盘检查MEDIA_MOUNTEDmountedSDCard已经挂载,并具有可读/写权限MEDIA_MOUNTED_READ_ONLYmounted_roSDCard已经挂载,并具有只读权限MEDIA_NOFSnofsSDCard为空白或正在使用不支持的文件系统MEDIA_REMOVEDremovedSDCard已经移除MEDIA_SHAREDsharedSDCard未安装,但通过USB共享返回MEDIA_UNKNOWNunknown未知MEDIA_UNMOUNTABLEunmountableSDCard无法挂载。即SDCard存在但不可以被安装MEDIA_UNMOUNTEDunmountedSDCard已卸掉,即SDCard存在但是没有被安装Environment类访问SD卡getExternalStoragePublicDirectory(Stringtype)是获取SD卡指定类型目录的路径方法。常见的目录路径常量。常量名常量值说明MEDIA_BAD_REMOVALbad_removalSDCard被卸载前己被移除DIRECTORY_DCIMDCIM相机拍摄照片存放的标准目录DIRECTORY_DOCUMENTSDocument文档存放的标准目录DIRECTORY_DOWNLOADSDownload下载文件存放的标准目录DIRECTORY_MOVIESMoives视频存放的标准目录DIRECTORY_MUSICMusic音乐存放的标准目录DIRECTORY_PICTURESPicture图片存放的标准目录Environment类访问SD卡访问SD卡权限声明为了正常访问SD卡,需要在AndroidManifest.xml文件中声明相关的访问权限。一般在AndroidManifest.xml文件的<application>元素前添加权限
<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"package="com.example.ee.helloandroid"><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><application……></application></manifest>访问SD卡权限设置访问SD卡为APP运行时授权Google将权限分为两类,一类是普通权限(NormalPermissions),这类权限不涉及用户隐私,是不需要用户进行授权的;另一类是危险权限(DangerousPermission),这类权限会涉及到用户隐私,需要用户进行授权。从Android6.0(SDK23)以后,系统在运行时权限上增加了对用户隐私权的保护功能。除了需要在AndroidManifest.xml中添加相应的访问权限声明外,还需要在应用项目APP的运行时,为每个危险权限类向系统进行请求授权。从外部存储设备中读写文件属于危险权限,因此需要在java代码中,使用系统提供的API检查并请求权限动态授权。访问SD卡权限设置访问SD卡权限检查和请求授权方法定义在ActivityCompat类中。1)检查权限方法ActivityCompat.checkSelfPermission(android.content.Context,java.lang.String)检查是否拥有指定的权限,返回类型为int类型,一般用符号常量表示。返回值为PackageManager.PERMISSION_GRANTED,表示已拥有权限;返回值为PERMISSION_DENIED,表示没有该权限,需要向用户请求授权。2)展示需要授权的理由方法shouldShowRequestPermissionRationale(Activityactivity,Stringpermission)在用户第一次点击一个需要权限的地方,该方法返回false,如果当用户选择了拒绝该权限,下次点击此权限处,该方法会返回true。检查与请求授权访问SD卡3)请求权限方法requestPermissions(Activityactivity,String[]permissions,intrequestCode)为该APP请求指定的权限。其中:第二个参数permissions是一个String数组,数组元素是APP所需要申请的所有权限。这些权限常量可以在Manifest类中找到。第三个参数requestCode标志该次授权的唯一请求码,当用户进行授权操作后在回调方法中可以根据这个标识符区分不同的授权操作。4)请求权限后的回调方法onRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults)该方法是OnRequestPermissionsResultCallback类中的方法,当执行了requestPermissions()方法后,系统会自动回调onRequestPermissionsResult()方法。其中第三个参数grantResults是int类型的数组,每个元素的值分别对应permissions的每个请求,取值由PackageManager的常量表示,为PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED。检查与请求授权访问SD卡为应用项目APP请求外存储器读写授权代码片段1privatestaticfinalintREQUEST_EXTSTO=1;privatestaticString[]PERMISSIONS_STORAGE={Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};3intpermission_read=ActivityCompat.checkSelfPermission(activity,Manifest.permission.READ_EXTERNAL_STORAGE);4intpermission_write=ActivityCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE);5//检查是否有读外存权限6if(permission_write!=PackageManager.PERMISSION_GRANTED||permission_read!=PackageManager.PERMISSION_GRANTED){7if(ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.READ_EXTERNAL_STORAGE)||ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE)){8AlertDialogdialog=newAlertDialog.Builder(this).setTitle("该权限保证对SD卡上文件进行读写操作").setPositiveButton("需要此权限!",newDialogInterface.OnClickListener(){9@Override10publicvoidonClick(DialogInterfacedialog,intwhich){ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE,REQUEST_EXTSTO);11}}).setNegativeButton("不授权",newDialogInterface.OnClickListener(){13@Override14publicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(MainActivity.this,"重新授权",Toast.LENGTH_SHORT).show();16}17}).show();18}else{19//没有权限,需要动态申请ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTSTO);21}在完成权限请求方法之后,即执行了ActivityCompat.requestPermissions()方法后,系统会自动回调onRequestPermissionsResult()方法。访问SD卡请求授权时会弹出Android系统内置的对话框,例如应用项目Activity_SurfaceView需要读取SD卡中的文件,在请求授权后会弹出访问授权对话框,如右图所示。用户不能自定义该对话框。该授权对话框一经用户同意授权,以后运行该APP都不会再出现。建议用户选择“ALLOW”,同意该授权。访问SD卡检测SD卡是否可用编写一个sdcardisavailable()方法来检测SD卡是否可用,该方法的代码如下
publicstaticbooleansdcardisavailable(){stringstatus=environment.getexternalstoragestate();if(!status.equals(environment.media_mounted)){returnfalse;}returntrue;}关于SD卡的相关编程片段访问SD卡获取SD卡的实际空间大小编写一个getrealsizeonsdcard()方法来获取SD卡的实际空间大小,该方法的代码如下
publicstaticlonggetrealsizeonsdcard(){filepath=newfile(environment.getexternalstoragedirectory().getabsolutepath());statfsstat=newstat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1秋天(说课稿)-2024-2025学年统编版(2024)语文一年级上册
- 2024年绿色建筑评估与改进服务合同
- 2024校企合作电商企业实习实训基地协议3篇
- 18 《囊萤夜读》(说课稿)2023-2024学年统编版语文四年级下册
- 2024版专项宣传材料采购协议模板版B版
- 企业员工安全生产教育培训
- 福建省南平市五夫中学高三地理上学期期末试卷含解析
- 福建省南平市渭田中学2021年高二语文下学期期末试卷含解析
- 2024年高端木器定制加工劳务分包合同模板3篇
- 2024年跨境电商配送条款3篇
- 公路桥梁工程施工安全风险评估指南
- 2024-2030年全球及中国通过硅通孔(TSV)技术行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- PEP新人教版小学英语单词三到五年级
- 拆除猪场补偿协议书模板
- 2024年秋季学期新Join In剑桥版(三年级起)英语三年级上册课件 Supplementary activities Unit 6
- 2024年新人教版道德与法治七年级上册全册教案(新版教材)
- 2024年高中生物新教材同步选择性必修第三册学习笔记第3章 本章知识网络
- 初中物理期末复习+专题5+综合能力题+课件++人教版物理九年级全一册
- 《创伤失血性休克中国急诊专家共识(2023)》解读课件
- 2024年国开电大 统计学原理 形成性考核册答案
- 药物流行病学教学大纲
评论
0/150
提交评论