09-12 15:24:33.903: W/System.err(19499): java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
09-12 15:25:25.763: E/SQLiteDatabase(19499): Failed to open database '/storage/sdcard1/ArcGIS/xxxxx.db'.
09-12 15:25:25.763: E/SQLiteDatabase(19499): android.database.sqlite.SQLiteException: not an error(Sqlite code 0): Could not open the database in read/write mode.,(OS error - 13:Permission denied)
09-12 15:25:25.763: E/SQLiteDatabase(19499): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
--------------------------------------------------------------------------------------------------------------------

2.3中声明

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

可以读写SDCARD,包括其他storage,比如内部flash,usb等等

4.0中如果只声明这个,会发现其他mount的设备有可能没有写权限,需要同时声明

<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>

这样才可以读写/mnf/flash , /mnt/usb, /mnt/externa等目录

可能4.0增加了对其他存储设备的内建支持,其他设备不再共享gid "sdcard_rw"

而改用"media_rw",相应的细分了权限声明

2.3中 dr-xrwxr-x system   sdcard_rw          1969-12-31 16:00 flash

4.0中 d---rwxr-x system   media_rw          1970-01-01 08:00 flash

权限控制文件在 frameworks/base/data/etc/platform.xml:

  1. <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
  2. <group gid="sdcard_rw" />
  3. </permission>
  4. <permission name="android.permission.WRITE_MEDIA_STORAGE" >
  5. <group gid="media_rw" />
  6. </permission>
4.4 开始限制第三方应用对外置存储卡(一般为外置可插拔TF卡)的读写权限,要申请到这个权限需要申请 WRITE_MEDIA_STORAGE 权限,而这个权限是需要系统签名才能生效的.
不过有些手机厂家会放开这个权限,使得应用申请了 WRITE_EXTERNAL_STORAGE 就可以访问外置存储卡 (相当于和4.4前一样了),这也是为了兼容之前应用做的折中.这么做的厂家也在逐渐减少. 限制读写外置存储卡,自然是为了类似用户隐私这类的需求考虑的.
比如,每个应用都在里面写东西,外置存储卡目录就会很乱.而作为可插拔卡,用户是会将此卡挂载到其他设备上的(比如PC),这时候用户就会面对的是一大堆不知所然的目录. 其实外置存储卡在4.4后还是可以读写的,只是Android对其做了限制.
第三方应用读写外置存储卡,仅限 Android/data/<Package.Name> 这一个目录(和内置存储卡对应目录一样) 5.1.1 查看etc/permissions/platform.xml,存在 WRITE_MEDIA_STORAGE 节点,AndroidManifest.xml增加<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
Eclipse会提示错误,需要clean一下当前工程,没有错误提示,可以编译,但依旧不能读取根目录中指定文件夹数据。

临时解决方案:在SD卡、USB设备中,创建 Android/data/<Package.Name> 文件夹,将数据移动到该目录之中。

参考资料:
http://blog.csdn.net/zmyde2010/article/details/7031461
http://blog.csdn.net/eustoma/article/details/7108144
https://zhidao.baidu.com/question/136950531811948485.html

Android 读写位于SD卡上的sqlite数据库文件错误问题的更多相关文章

  1. android中读取SD卡上的数据

    通过Context的openFileInput或者openFileOutput打开的文件输入输出流是操作应用程序的数据文件夹里的文件,这样存储的大小比较有限,为了更好的存取应用程序的大文件数据,应用程 ...

  2. Android开发之SD卡上文件操作

    1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...

  3. Android 读取手机SD卡根目录下某个txt文件的文件内容

    1.先看activity_main.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  4. android开发之-查看、编辑手机sqlite数据库文件-实测

    效果图: 1.开始——运行——输入cmd ,输入adb shell,错误:一是“adb不是内部命令或外部命令,也不是可运行的程序或批处理文件”,二是“error:device not found”. ...

  5. android进入adb shell步骤及修改sqlite数据库文件的权限

    1 准备工作 (1)将adb.exe从  \Sdk\platform-tools目录下移动到 \Sdk\tools目录下(主要是看emulator这几个文件在哪个文件夹就把adb.exe移动到哪个文件 ...

  6. android打开存储卡(TF卡\SD卡)中的sqlite文件

    android的SDK直接支持sqlite3的API.   打开SD卡上面的sqlite数据库,不需要SQLiteOpenHelper的继承类.只需要,SQLiteDatabase中的一些静态方法.如 ...

  7. android 操作SD卡上的文件

    (1)说明:操作SD卡上的文件须要增加下面权限  在SD卡上创建和删除文件权限  <uses-permission android:name="android.permission.M ...

  8. android学习笔记47——读写SD卡上的文件

    读写SD卡上的文件 通过Context的openFileInput.openFileOutput来打开文件输入流.输出流时,程序打开的都是应用程序的数据文件夹里的文件,其存储的文件大小可能都比较有限- ...

  9. Android使用sqlliteOpenhelper更改数据库的存储路径放到SD卡上

    假设使用默认的系统管理,默认放在包以下.比較省心.并且在卸载app后不会造成数据残留.可是这样也有一个问题.比方我做一个背单词的软件,那么当用户卸载掉这个app时,他辛辛苦苦下载的单词库也没了... ...

随机推荐

  1. Spring Boot干货系列:(二)配置文件解析

    Spring Boot干货系列:(二)配置文件解析 2017-02-28 嘟嘟MD 嘟爷java超神学堂   前言 上一篇介绍了Spring Boot的入门,知道了Spring Boot使用“习惯优于 ...

  2. selinux开关

    状态查看 /usr/sbin/sestatus -v 临时打开 setenforce 1 #设置SELinux 成为enforcing模式 临时关闭 setenforce 0 #设置SELinux 成 ...

  3. QT安装在VS2008中的方法

    (一)工欲善其事,必先利其器,废话不多讲. 原文:http://www.cnblogs.com/zwq194/archive/2011/02/19/1958713.html 总结起来网上流行的VS20 ...

  4. list集合绑定在datagridview上时如何实现排序

    List<Person> lst = new List<Person>(); lst.Add(new Person("A", "1")) ...

  5. ubuntu 14.04 安装中文输入法

    记录Ubuntu 14.04 里面安装中文输入法的过程 先安装如下包 sudo apt-get install ibus sudo apt-get install ibus ibus-clutter ...

  6. navicat导入csv

    1.navicat for mysql 导入csv时出错,主要是由于csv中包含汉字所致: 2.解决办法为再host新连接时,选择高级,然后在编码菜单里选择20936 (Simplified Chin ...

  7. Keypress - 捕获键盘输入的JavaScript库

    Keypress 是一个强大的 JavaScript 库,用于捕获键盘输入.这是一个有非常特殊的功能的输入捕获库,它是很容易掌握和使用,并且不依赖第三方库.在网站开发中,经常会碰到需要处理键盘输入的场 ...

  8. 跑在Docker下的RHEL7编译Java8源码包

    1.运行Docker时需要加参数--cap-add=SYS_PTRACE,比如: docker run --cap-add=SYS_PTRACE --name buildjava8 -v /opt/r ...

  9. GIt的基本知识

    以前已经把git 看过一遍了,由于好久没有用它 ,现在已经忘了.现在呢,要用它进行同步代码,所以呢,我打算记一记,再复习复习. 参考文件:https://git-scm.com/book/zh/v2 ...

  10. C# 过滤sql特殊字符方法集合

    1./// <summary>    /// 过滤不安全的字符串    /// </summary>    /// <param name="Str" ...