Merge pull request #9221 from JosJuice/android-saf-sd-card

Android: Use storage access framework for custom SD card paths
This commit is contained in:
JMC47 2020-12-10 16:32:43 -05:00 committed by GitHub
commit 75899b0e11
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 311 additions and 47 deletions

View file

@ -10,6 +10,7 @@
#include <jni.h>
#include "Common/Assert.h"
#include "Common/StringUtil.h"
#include "jni/AndroidCommon/IDCache.h"
@ -42,21 +43,35 @@ std::vector<std::string> JStringArrayToVector(JNIEnv* env, jobjectArray array)
return result;
}
bool IsPathAndroidContent(const std::string& uri)
{
return StringBeginsWith(uri, "content://");
}
std::string OpenModeToAndroid(std::string mode)
{
// The 'b' specifier is not supported. Since we're on POSIX, it's fine to just skip it.
if (!mode.empty() && mode.back() == 'b')
mode.pop_back();
if (mode == "r+")
mode = "rw";
else if (mode == "w+")
mode = "rwt";
else if (mode == "a+")
mode = "rwa";
else if (mode == "a")
mode = "wa";
return mode;
}
int OpenAndroidContent(const std::string& uri, const std::string& mode)
{
JNIEnv* env = IDCache::GetEnvForThread();
const jint fd = env->CallStaticIntMethod(IDCache::GetContentHandlerClass(),
IDCache::GetContentHandlerOpenFd(), ToJString(env, uri),
ToJString(env, mode));
// We can get an IllegalArgumentException when passing an invalid mode
if (env->ExceptionCheck())
{
env->ExceptionDescribe();
abort();
}
return fd;
return env->CallStaticIntMethod(IDCache::GetContentHandlerClass(),
IDCache::GetContentHandlerOpenFd(), ToJString(env, uri),
ToJString(env, mode));
}
bool DeleteAndroidContent(const std::string& uri)