• 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

  • 相关阅读:
    ASP.Net设计时需要考虑的性能优化问题 转载自http://blog.sina.com.cn/s/blog_3d7bed650100055p.html
    Jqeruy dropdownlist 联动
    Sound Recording in Windows Phone 7
    Windows Phone Performance 系列网址集合
    【xml]: Read XML with Namespace resolution using XLinq.XElement
    编程基础字符篇(2)
    每日总结一:
    每日总结5:
    Control usage: (1) Windows Phone 7: Popup control
    编程基础字符篇(3)
  • 原文地址:https://www.cnblogs.com/defineconst/p/7510380.html
Copyright © 2020-2023  润新知