unknown error (Sqlite code 14): Could not open database解决方案

本文介绍了解决Android 6.0及以上版本系统中遇到的读写外部存储权限问题的方法。通过手动请求权限或引导用户在设置中开启权限的方式,解决了因系统升级导致的应用无法正常访问外部存储的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

今天在运行之前一个项目是突然一运行就崩溃,感觉甚是奇怪,查看log日志发现:

Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14): Could not open database, (OS error - 13:Permission denied)


根据日志提示好像是缺少权限,因为项目只用到了存储,然后去查看AndroidManifest.xml中的权限,发现

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


这两条权限都在呀,这是怎么回事呢,百度了下都说是权限未添加。最后突然想到我这台手机是Android6.0的系统,然后为了验证,找了一台4.0系统的运行,直接就运行起来了,好了这下找到问题了就好解决了。
Android6.0以后出现了很多权限即使在AndroidManifest.xml中配置了也不行,必须手动请求,或者在设置-应用-权限打开对应的权限。
在6.0系统以后使用有些权限是可以进行这样的操作:

public static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
/**
* 验证读取sd卡的权限
*
* @param activity
*/
public boolean verifyStoragePermissions(Activity activity) {
/*******below android 6.0*******/
if (Build.VERSION.SDK_INT < 23) {
return true;
}
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
return false;
} else {
return true;
}

}

在调用请求权限的Activity中重写 
/**
 * 请求权限回调
 *
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_EXTERNAL_STORAGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showToast("授权成功");
} else {
showToast("授权失败,请去设置打开权限");
}
}
}

可以将权限名换掉变成请求其他权限。做一个小的记录,同时希望可以帮助有需要的人。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值