一、文件读写权限简介
在Android系统中,应用程序之间的文件访问权限是独立的,每个应用程序都只能访问自己的数据,如果需要访问其他应用程序的数据,则需要通过特定的权限来访问。在Android平台中,每个应用程序都有一个私有的文件系统,只有该应用程序才能访问。
Android 6.0(API 23)引入了运行时权限的概念,包括文件读写权限。如果应用程序需要读写外部存储器上的文件,就需要在运行时请求相应的权限。否则,当应用程序尝试读写外部存储器时,Android系统会引发SecurityException。
二、文件读写权限的获取
Android 6.0之前,应用程序在安装的时候会自动获取系统默认授权,而且不需要用户的确认。如果开发者在应用程序中使用了访问外部存储器上文件的相关API,就会自动获得相应的权限。
// 判断是否有读取外部存储器的权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 没有权限,请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); } else { // 已经有权限,进行文件读取操作 readExternalStorage(); }
Android 6.0及以后版本,需要在运行时请求相应的权限。以下代码演示了如何请求读取外部存储器的权限:
private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1; // 请求权限的回调结果处理 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { // 判断用户是否授权 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 授权成功,继续执行操作 readExternalStorage(); } else { // 授权失败,提示用户打开权限管理页面打开该权限 Toast.makeText(this, "无法读取外部存储器,请检查是否已授权", Toast.LENGTH_LONG) .show(); } return; } } } // 判断是否有读取外部存储器的权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 没有权限,请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); } else { // 已经有权限,进行文件读取操作 readExternalStorage(); }
三、读取文件
Android系统提供了以下方法用于读取文件:
- Context.openFileInput(String name):用于打开一个文件并返回一个指向该文件的输入流
- FileInputStream(File file):根据一个File对象打开一个文件并返回一个指向该文件的输入流
- FileInputStream(String path):根据一个文件路径打开一个文件并返回一个指向该文件的输入流
示例代码如下:
String filename = "test.txt"; FileInputStream fis = null; try { fis = openFileInput(filename); byte[] buffer = new byte[fis.available()]; fis.read(buffer); String result = new String(buffer); Log.d(TAG, result); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, e.getMessage()); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } }
四、写入文件
Android系统提供了以下方法用于写入文件:
- Context.openFileOutput(String name, int mode):用于打开一个文件并返回一个指向该文件的输出流
- FileOutputStream(File file):根据一个File对象打开一个文件并返回一个指向该文件的输出流
- FileOutputStream(String path):根据一个文件路径打开一个文件并返回一个指向该文件的输出流
示例代码如下:
String filename = "test.txt"; String data = "Hello, world!"; FileOutputStream fos = null; try { fos = openFileOutput(filename, Context.MODE_PRIVATE); fos.write(data.getBytes()); Log.d(TAG, "Write file successfully."); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, e.getMessage()); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
五、总结
本文主要介绍了Android中文件读写权限的相关知识点,包括文件读写权限的简介、权限的获取、读取文件和写入文件。文件读写是Android应用程序中非常基础的功能,学好文件读写权限相关知识对学习Android开发非常重要。