在android 11上将数据库从我的应用程序“a”复制到我的应用程序“b”

qlckcl4x  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(210)

我已经发布了应用程序“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的方法?
任何帮助/想法。谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题