android教程向文件指定位置写数据
- 格式:doc
- 大小:14.00 KB
- 文档页数:1
Android读写文件权限流程概述在A nd ro id开发中,应用程序需要获取特定的权限以便能够读取和写入设备上的文件。
本文将介绍An dr oi d中读写文件权限的流程,帮助开发者了解如何正确处理文件访问权限相关的问题。
为什么需要文件权限A n dr oi d系统为了保护用户的隐私和数据安全,对应用程序的文件访问进行了限制。
如果应用程序想要读取或写入设备上的文件,必须首先获取相应的权限。
否则,在没有权限的情况下进行文件操作将会引发安全异常。
文件读取权限步骤1:在A n d r o i dM a n i f e s t.x m l中声明权限要读取设备上的文件,首先需要在应用的清单文件(A nd ro id Ma ni fe st.xm l)中声明文件读取权限。
可以使用以下代码将读取权限添加到清单文件中:<u se s-p e rm is si on an dr oid:na me="an dr oi d.p e rm is si on.R EA D_E X TE RN AL_ S T OR AG E"/>这个权限允许应用程序读取外部存储(如S D卡)上的文件。
步骤2:检查权限在代码中进行文件读取操作前,需要先检查应用是否已经获得了文件读取权限。
可以使用以下代码来检查权限:i f(C on te xt Co mp at.c he ck Se lf Pe rm iss i on(c on te xt,M ani f es t.p e r mi ss io n.RE AD_EX T ER NA L_ST OR AG E)!=Pa ck ag eM an ag er.P ER MI SS I O N_G RA NT ED){//没有读取权限,请求权限}e ls e{//已经有读取权限,进行文件读取操作}步骤3:请求权限如果在步骤2中检查到没有读取权限,应该向用户请求获取该权限。
AndroidFile存储(⼆):⽂件读写⼀、Android 应⽤常⽤存储路径1.1、常⽤路径/data/data/包名//sdcard/Android/data/包名//sdcard/xxx前两个是应⽤内部存储, 会随着app的卸载⽽⾃动删除, sdcard中其他的⽂件夹不会⾃动删除, 除⾮⽤户⼿动删除, 否则会⼀直存在, 换句话说就是垃圾.Google官⽅建议把数据存储在 /sdcard/Android/data/包名/ 下.1.2、路径获取⽅法前两个应⽤内部存储通过 Context 来获取, 第三个作为外部存储是通过 Environment 类来获取. 注释为返回值.1 a、/data/data/包名/2 context.getFilesDir(); // /data/data/包名/files3 context.getCacheDir(); // /data/data/包名/cache4 b、/sdcard/Android/data/包名/5 context.getExternalFilesDir(); // /sdcard/Android/data/包名/files6 context.getExternalCacheDir(); // /sdcard/Android/data/包名/cache7 c、/sdcard/xxx8 Environment.getExternalStorageDirectory(); //内置sdcard注意, 根据源码⽂档中说明, 获取外部存储时, 有可能会因为各种问题导致获取失败, 建议先使⽤ getExternalStorageState 来判断外部存储状态, 如果已挂载的话再存储.⼆、Android应⽤私有存储⽂件的写⼊与读取使⽤⽂件I/O ⽅法可以直接往⼿机中存储数据,默认情况下这些⽂件不可以被其他的应⽤程序访问。
Android平台⽀持 java平台下的⽂件I/O操作,主要使⽤FileInputStream 和 FileOutputStream 这两个类来实现⽂件的存储与读取。
MK⽂件的写法android编译系统的makefile⽂件Android.mk写法如下(1)Android.mk⽂件⾸先需要指定LOCAL_PATH变量,⽤于查找源⽂件。
由于⼀般情况下Android.mk和需要编译的源⽂件在同⼀⽬录下,所以定义成如下形式:LOCAL_PATH:=$(call my-dir)上⾯的语句的意思是将LOCAL_PATH变量定义成本⽂件所在⽬录路径。
(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束。
include $(CLEAR_VARS)CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表⽰编译成静态库。
include $(BUILD_SHARED_LIBRARY)表⽰编译成动态库。
include $(BUILD_EXECUTABLE)表⽰编译成可执⾏程序。
(3)举例如下(frameworks/base/libs/audioflinger/Android.mk):LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) 模块⼀ifeq ($(AUDIO_POLICY_TEST),true)ENABLE_AUDIO_DUMP := trueendifLOCAL_SRC_FILES:= \AudioHardwareGeneric.cpp \AudioHardwareStub.cpp \AudioHardwareInterface.cppifeq ($(ENABLE_AUDIO_DUMP),true)LOCAL_SRC_FILES += AudioDumpInterface.cppLOCAL_CFLAGS += -DENABLE_AUDIO_DUMPendifLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libmedia \libhardware_legacyifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)LOCAL_CFLAGS += -DGENERIC_AUDIOendifLOCAL_MODULE:= libaudiointerfaceifeq ($(BOARD_HAVE_BLUETOOTH),true)LOCAL_SRC_FILES += A2dpAudioInterface.cppLOCAL_SHARED_LIBRARIES += liba2dpLOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DPLOCAL_C_INCLUDES += $(call include-path-for, bluez)endifinclude $(BUILD_STATIC_LIBRARY) 模块⼀编译成静态库include $(CLEAR_VARS) 模块⼆LOCAL_SRC_FILES:= \AudioPolicyManagerBase.cppLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libmediaifeq ($(TARGET_SIMULATOR),true)LOCAL_LDLIBS += -ldlelseLOCAL_SHARED_LIBRARIES += libdlendifLOCAL_MODULE:= libaudiopolicybaseifeq ($(BOARD_HAVE_BLUETOOTH),true)LOCAL_CFLAGS += -DWITH_A2DPendififeq ($(AUDIO_POLICY_TEST),true)LOCAL_CFLAGS += -DAUDIO_POLICY_TESTendifinclude $(BUILD_STATIC_LIBRARY) 模块⼆编译成静态库include $(CLEAR_VARS) 模块三LOCAL_SRC_FILES:= \AudioFlinger.cpp \AudioMixer.cpp.arm \AudioResampler.cpp.arm \AudioResamplerSinc.cpp.arm \AudioResamplerCubic.cpp.arm \AudioPolicyService.cppLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libmedia \libhardware_legacyifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybaseLOCAL_CFLAGS += -DGENERIC_AUDIOelseLOCAL_SHARED_LIBRARIES += libaudio libaudiopolicyendififeq ($(TARGET_SIMULATOR),true)LOCAL_LDLIBS += -ldlelseLOCAL_SHARED_LIBRARIES += libdlendifLOCAL_MODULE:= libaudioflingerifeq ($(BOARD_HAVE_BLUETOOTH),true)LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DPLOCAL_SHARED_LIBRARIES += liba2dpendififeq ($(AUDIO_POLICY_TEST),true)LOCAL_CFLAGS += -DAUDIO_POLICY_TESTendififeq ($(TARGET_SIMULATOR),true)ifeq ($(HOST_OS),linux)LOCAL_LDLIBS += -lrt -lpthreadendifendififeq ($(BOARD_USE_LVMX),true)LOCAL_CFLAGS += -DLVMXLOCAL_C_INCLUDES += vendor/nxpLOCAL_STATIC_LIBRARIES += liblifevibesLOCAL_SHARED_LIBRARIES += liblvmxservice# LOCAL_SHARED_LIBRARIES += liblvmxipcendifinclude $(BUILD_SHARED_LIBRARY) 模块三编译成动态库(4)编译⼀个应⽤程序(APK)LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectory-->直译(建⽴在java⼦⽬录中的所有Java⽂件) LOCAL_SRC_FILES := $(call all-subdir-java-files)# Name of the APK to build-->直译(创建APK的名称)LOCAL_PACKAGE_NAME := LocalPackage# Tell it to build an APK-->直译(告诉它来建⽴⼀个APK)include $(BUILD_PACKAGE)(5)编译⼀个依赖于静态Java库(static.jar)的应⽤程序LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# List of static libraries to include in the packageLOCAL_STATIC_JAVA_LIBRARIES := static-library# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)# Name of the APK to buildLOCAL_PACKAGE_NAME := LocalPackage# Tell it to build an APKinclude $(BUILD_PACKAGE)(6)编译⼀个需要⽤平台的key签名的应⽤程序LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)# Name of the APK to buildLOCAL_PACKAGE_NAME := LocalPackageLOCAL_CERTIFICATE := platform# Tell it to build an APKinclude $(BUILD_PACKAGE)(7)编译⼀个需要⽤特定key前⾯的应⽤程序LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)# Name of the APK to buildLOCAL_PACKAGE_NAME := LocalPackageLOCAL_CERTIFICATE := vendor/example/certs/app# Tell it to build an APKinclude $(BUILD_PACKAGE)(8)添加⼀个预编译应⽤程序LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Module name should match apk name to be installed.LOCAL_MODULE := LocalModuleNameLOCAL_SRC_FILES := $(LOCAL_MODULE).apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) include $(BUILD_PREBUILT)(9)添加⼀个静态JAVA库LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)# Any libraries that this library depends onLOCAL_JAVA_LIBRARIES := android.test.runner# The name of the jar file to createLOCAL_MODULE := sample# Build a static jar file.include $(BUILD_STATIC_JAVA_LIBRARY)(10)Android.mk的编译模块中间可以定义相关的编译内容,也就是指定相关的变量如下:LOCAL_AAPT_FLAGSLOCAL_ACP_UNAVAILABLELOCAL_ADDITIONAL_JAVA_DIRLOCAL_AIDL_INCLUDESLOCAL_ALLOW_UNDEFINED_SYMBOLSLOCAL_ARM_MODELOCAL_ASFLAGSLOCAL_ASSET_DIRLOCAL_ASSET_FILES 在Android.mk⽂件中编译应⽤程序(BUILD_PACKAGE)时设置此变量,表⽰资源⽂件,通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)LOCAL_BUILT_MODULE_STEMLOCAL_C_INCLUDES 额外的C/C++编译头⽂件路径,⽤LOCAL_PATH表⽰本⽂件所在⽬录举例如下:LOCAL_C_INCLUDES += extlibs/zlib-1.2.3LOCAL_C_INCLUDES += $(LOCAL_PATH)/srcLOCAL_CC 指定C编译器LOCAL_CERTIFICATE 签名认证LOCAL_CFLAGS 为C/C++编译器定义额外的标志(如宏定义),举例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1LOCAL_CLASSPATHLOCAL_COMPRESS_MODULE_SYMBOLSLOCAL_COPY_HEADERS install应⽤程序时需要复制的头⽂件,必须同时定义LOCAL_COPY_HEADERS_TOLOCAL_COPY_HEADERS_TO install应⽤程序时复制头⽂件的⽬的路径LOCAL_CPP_EXTENSION 如果你的C++⽂件不是以cpp为⽂件后缀,你可以通过LOCAL_CPP_EXTENSION指定C++⽂件后缀名如:LOCAL_CPP_EXTENSION := .cc注意统⼀模块中C++⽂件后缀必须保持⼀致。
在android中的文件放在不同位置,它们的读取方式也有一些不同。
本文对android中对资源文件的读取、数据区文件的读取、SD卡文件的读取及RandomAccessFile的方式和方法进行了整理。
供参考。
一、资源文件的读取:1) 从resource的raw中读取文件数据:String res = "";try{//得到资源中的Raw数据流InputStream in = getResources().openRawResource(R.raw.test);//得到数据的大小int length = in.available();byte [] buffer = new byte[length];//读取数据in.read(buffer);//依test.txt的编码类型选择合适的编码,如果不调整会乱码res = EncodingUtils.getString(buffer, "BIG5");//关闭in.close();}catch(Exception e){e.printStackTrace();}2) 从resource的asset中读取文件数据String fileName = "test.txt"; //文件名字String res="";try{//得到资源中的asset数据流InputStream in = getResources().getAssets().open(fileName);int length = in.available();byte [] buffer = new byte[length];in.read(buffer);in.close();res = EncodingUtils.getString(buffer, "UTF-8");}catch(Exception e){e.printStackTrace();}二、读写/data/data/<应用程序名>目录上的文件://写数据public void writeFile(String fileName,String writestr) throws IOException{try{FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE); byte [] bytes = writestr.getBytes();fout.write(bytes);fout.close();}catch(Exception e){e.printStackTrace();}}//读数据public String readFile(String fileName) throws IOException{String res="";try{FileInputStream fin = openFileInput(fileName);int length = fin.available();byte [] buffer = new byte[length];fin.read(buffer);res = EncodingUtils.getString(buffer, "UTF-8");fin.close();}catch(Exception e){e.printStackTrace();}return res;}三、读写SD卡中的文件。
Android应⽤中使⽤XmlSerializer序列化XML数据的教程⾸先,我们看⼀下什么是serializer,serializer就是串⾏化,⼜名序列化。
它可并不只是简单的把对象保存在存储器上,它可以使我们在流中传输对象,使对象变的可以像基本数据⼀样传递。
XmlSerializer是针对XML进⾏序列化的类库,我们先来看⼀下⾥⾯的常⽤⽅法:基本⽅法1.创建⼀个xml⽂件的序列化器,返回的是⼀个Xml的 Serializer 对象。
XmlSerializer = Xml.newSerializer();2.设置序列化器的输出路径和编码⽅式FileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"⽂件名.xml"));XmlSerializer.setOutput(FileOutputStream, "编码");3.声明xml⽂件头(写⼊XML⽂件中的声明头)serializer.startDocument("xml声明的编码", ⽂档是否独⽴);4.声明⼦节点Serializer.startTag(nameSpace,String "节点名");5.声明节点属性Serializer.attribute(命名空间,属性名,属性值);6.声明节点中的TextNodeSerializer.txt(⽂本值);7.设置节点尾标签Serializer.endTag(命名空间, "节点名");8.写Xml⽂件尾表⽰Xml⽂件结束。
Serializer.endDocument();9.关闭资源FileOutputStream.close();⽰例最终效果图如上现在粘贴主要代码:main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/textView"/></LinearLayout>activity的代码package .xmlseriliazer;import java.io.StringWriter;import java.util.ArrayList;import org.xmlpull.v1.XmlPullParserFactory;import org.xmlpull.v1.XmlSerializer;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;/**** @author chenzheng_java* @description 测试通过XmlSerilizer⽣成xml⽂件* @since 2011/03/03**/public class XmlSerializerActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);String result = produceXml();TextView textView = (TextView)this.findViewById(R.id.textView);textView.setText(result);}/**** @return ⽣成的xml⽂件的字符串表⽰*/private String produceXml(){StringWriter stringWriter = new StringWriter();ArrayList<Beauty> beautyList = getData();try {// 获取XmlSerializer对象XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlSerializer xmlSerializer = factory.newSerializer();// 设置输出流对象xmlSerializer.setOutput(stringWriter);/** startDocument(String encoding, Boolean standalone)encoding代表编码⽅式* standalone ⽤来表⽰该⽂件是否呼叫其它外部的⽂件。
Android应用开发入门教程导论:1. 介绍Android应用开发的基本概念和步骤。
2. 解释为什么Android应用开发是一个有前途的领域。
第一部分:前期准备1. 安装和配置开发环境a. 下载并安装Java Development Kit (JDK)b. 下载并安装Android Studio集成开发环境 (IDE)c. 配置Android开发环境变量2. 创建一个新项目a. 在Android Studio中创建一个新的项目b. 理解Android项目的组织结构和文件第二部分:用户界面设计1. 界面布局:a. 介绍常用的Android布局方式b. 创建XML布局文件c. 使用Visualization Editor设计界面2. 用户界面元素:a. Button按钮b. TextView文本框c. EditText输入框d. ImageView图片视图e. ListView列表视图f. RecyclerView可滚动列表视图第三部分:应用逻辑和交互1. Activity:a. 什么是Activityb. 创建新的Activityc. Activity生命周期方法2. Intent和数据传递:a. Intent的概念和用途b. 在Activity之间传递数据3. 用户输入和输出:a. 处理按钮点击事件b. 获取和验证用户输入c. 显示提示和警告信息4. 使用数据库:a. 创建和管理SQLite数据库b. 执行数据库操作,如插入、更新和查询数据第四部分:应用发布和测试1. 应用测试:a. 使用模拟器测试应用b. 在真实设备上测试应用2. 应用发布:a. 生成签名证书b. 配置应用发布信息c. 生成APK文件d. 将应用上传到应用商店结论:1. 总结Android应用开发的基本知识和技能。
2. 强调继续学习和探索Android的重要性。
android 文本文件的正确写入(防止中文乱码)2017/01/19 276 android 文本文件写入流程1,写入文件的路径2,获取写入流3,写入数据,记得转换格式(UFT-8 在android 不能用,只能用gbk)开始写代码:首先根据文件地址判断文件是否存在,不存在就创建新文件File file = new File(path); if (!file.exists()) { file.createNewFile(); } 然后获取写入流FileOutputStream outputStream = new FileOutputStream(file, true); true 是不覆盖写入文件,只在文本最后写入,false 是只在文本最开始写入,只传入file 则覆盖式写入文本文件。
最后写入内容//记住用gbk outputStream.write(content.getBytes(“gbk”));当然不要忘了关闭outputStream.flush(); outputStream.close(); 还有捕获异常FileNotFoundException 和IOException 完成。
总体代码:public static void writeStr2Txt(String content, String path) { try { File file = new File(path); if (!file.exists()) { file.createNewFile(); FileOutputStream outputStream = new FileOutputStream(file, true); outputStream.write(content.getBytes(“gbk”)); outputStream.flush(); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }tips:感谢大家的阅读,本文由我司收集整编。