具有访问SD系统权限的Android应用程序

具有访问SD系统权限的Android应用程序,android,android-sdcard,android-permissions,Android,Android Sdcard,Android Permissions,我有一个复杂的场景。我有两个应用程序共享其中一个的数据库。这是通过使用相同的“共享id”来完成的,并且工作正常。但是,我还需要授予某个应用程序系统更改设备时间的权限。这也很好。当我想从该应用程序访问SD时,问题就出现了。如果我给它系统特权,我就不能再访问SD了(有解决办法吗?)。我考虑让另一个应用程序来做这项工作,但是为了访问数据库,它应该有相同的“共享id”,因此它也应该有系统权限 简单地说,我希望应用程序具有系统权限,同时访问SD。我有另一个共享数据库的应用程序 我找到的一个解决方案是使用C

我有一个复杂的场景。我有两个应用程序共享其中一个的数据库。这是通过使用相同的“共享id”来完成的,并且工作正常。但是,我还需要授予某个应用程序系统更改设备时间的权限。这也很好。当我想从该应用程序访问SD时,问题就出现了。如果我给它系统特权,我就不能再访问SD了(有解决办法吗?)。我考虑让另一个应用程序来做这项工作,但是为了访问数据库,它应该有相同的“共享id”,因此它也应该有系统权限

简单地说,我希望应用程序具有系统权限,同时访问SD。我有另一个共享数据库的应用程序

我找到的一个解决方案是使用ContentProvider,这样我可以将数据传输到另一个应用程序(不共享相同的id),并在那里处理SD访问。然而,这种方法需要对我已有的解决方案进行大量修改,这是我最后的选择。我还检查了是否可以将数据库公开(Mode_world_read),但现在已被弃用

还有其他方法可以克服这个限制吗?一个想法是将数据库保存在另一个应用程序可以访问的自定义文件夹中。这可能吗?应用程序能否访问Android设备上的其他文件夹?我可以从不在/data/data/{package name}/databases/中的数据库中读取数据吗?请记住,这些应用是私有的,它们不会出现在应用商店中,因此授予系统权限没有问题。

向其他应用共享数据库的最佳(也是正确的)方法可能是通过内容提供商公开数据,否则很快就会出现任何同步问题,或者两个应用程序同时尝试修改DB文件

我不知道为什么你没有SD访问权限,但听起来你不想访问另一个应用程序的私有存储,这通常是不可能的

我可以从不在/data/data/{package中的数据库中读取数据吗 名称}/databases/

SQLiteOpenHelper
通过上下文访问数据库。要覆盖数据库路径,可以使用
ContextWrapper
如下所示:

public class TestContext extends ContextWrapper{
    public TestContext(Context base) {
        super(base);
    }

    @Override
    public File getDatabasePath(String name) {
        // name is passed here from SQLiteOpenHelper
        return new File("path to DB on SD card");
    }
}
然后,当您要创建DB helper时,使用该
TestContext

public class TestSQLiteHelper extends SQLiteOpenHelper {

    public TestSQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(new TestContext(context), name, factory, version);
    }
}

TestSQLiteHelper
尝试访问DB文件时,它将调用
getDatabasePath()
其中将返回带有自定义路径的
file

为什么系统应用程序不能访问SD(卡)?这是否意味着非系统应用程序可以?是的,它们可以。至于系统应用程序,我想安卓是出于安全考虑而实施的。(依赖SD是有风险的)