我已经发布了应用程序“a”。现在我准备发布应用程序“b”,它应该从应用程序“a”加载复制数据库,以允许用户继续写入数据。
此代码来自应用程序“a”将数据库从内部存储保存到作用域存储上的文件:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, "/databasename.db");
values.put(MediaStore.MediaColumns.MIME_TYPE, "application/vnd.sqlite3");
values.put(MediaStore.MediaColumns.RELATIVE_PATH, DIRECTORY_DOWNLOADS);
Uri uri = getContentResolver().insert(MediaStore.Files.getContentUri("external"), values);
if (uri != null) {
OutputStream outputStream = getContentResolver().openOutputStream(uri);
if (outputStream != null) {
outputStream.write("This is menu category data.".getBytes());
outputStream.close();
Toast.makeText(ActivitySettings.this, "File created successfully", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(ActivitySettings.this, "outputStream == null", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(ActivitySettings.this, "uri == null", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
Toast.makeText(ActivitySettings.this, "Fail to create file", Toast.LENGTH_SHORT).show();
}
应用程序“b”中的此代码应上载保存在应用程序“a”中的数据库文件:
try {
File sd = Environment.getDataDirectory();
File data = Environment.getStorageDirectory();
try {
String currentDBPath = "emulated/0/" + DIRECTORY_DOWNLOADS + "/databasename.db";
String backupDBPath = "/data/com.example.mypackagename/databases/databasename.db";
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (currentDB.exists()) {
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Toast.makeText(this, R.string.toast_db_loaded_succesfully, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, R.string.toast_db_not_exists, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, R.string.toast_not_access, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Log.e("DBError", "exception", e);
Toast.makeText(this, R.string.toast_error_load_db, Toast.LENGTH_LONG).show();
}
它在android 10及以下版本上运行良好,但由于android 11的作用域存储的新访问规则,这是不可能的。有了manage_external_storage权限,这是可能的,但在我的情况下,谷歌可能会因为违反策略而拒绝应用程序“b”。
shareduserid已弃用
通过fileprovider共享文件,该文件由活动通过ui和其他用户操作执行。
但我需要一种不需要任何额外操作的方式,只需从应用程序“b”单击一下即可加载数据库。在安卓11上有可能吗?也许有一种替代shareduserid的方法?
任何帮助/想法。谢谢
暂无答案!
目前还没有任何答案,快来回答吧!