zoukankan      html  css  js  c++  java
  • Android 读写位于SD卡上的sqlite数据库文件错误问题

    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.   
    5.   
    6. <permission name="android.permission.WRITE_MEDIA_STORAGE" >  
    7.     <group gid="media_rw" />  
    8. </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

  • 相关阅读:
    制作软件说明书的图片编辑工具推荐PicPick
    浅谈配网供电可靠性及管理措施
    C#的winform中MDI 父窗体改变背景色
    Windows完成端口与Linux epoll技术简介
    django中的form表单
    调整图层初识3
    PS图层混合模式详解
    图层混合模式之正片叠底、滤色
    photoshop调整图层初识1
    调整图层初识2
  • 原文地址:https://www.cnblogs.com/defineconst/p/7510380.html
Copyright © 2011-2022 走看看