diff options
author | Max Kellermann <max@duempel.org> | 2014-03-01 17:46:59 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-03-01 18:48:20 +0100 |
commit | 58771fc41c411769d3ab7248c7fab00e8dbbecef (patch) | |
tree | 2c63049a00e19a32931771162c3e94320f4e146d /src/android | |
parent | 1e06c66c776e2dca217059d7d94309b0c5431a3f (diff) |
Android: obtain music directory from Environment.getExternalStoragePublicDirectory()
Diffstat (limited to 'src/android')
-rw-r--r-- | src/android/Environment.cxx | 117 | ||||
-rw-r--r-- | src/android/Environment.hxx | 43 |
2 files changed, 160 insertions, 0 deletions
diff --git a/src/android/Environment.cxx b/src/android/Environment.cxx new file mode 100644 index 000000000..40f4cfd41 --- /dev/null +++ b/src/android/Environment.cxx @@ -0,0 +1,117 @@ +/* +Copyright_License { + + XCSoar Glide Computer - http://www.xcsoar.org/ + Copyright (C) 2000-2013 The XCSoar Project + A detailed list of copyright holders can be found in the file "AUTHORS". + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +*/ + +#include "Environment.hxx" +#include "java/Class.hxx" +#include "java/String.hxx" +#include "java/File.hxx" +#include "util/StringUtil.hxx" + +namespace Environment { + static Java::TrivialClass cls; + static jmethodID getExternalStorageDirectory_method; + static jmethodID getExternalStoragePublicDirectory_method; + + static jstring getExternalStorageDirectory(JNIEnv *env); +}; + +void +Environment::Initialise(JNIEnv *env) +{ + cls.Find(env, "android/os/Environment"); + + getExternalStorageDirectory_method = + env->GetStaticMethodID(cls, "getExternalStorageDirectory", + "()Ljava/io/File;"); + + getExternalStoragePublicDirectory_method = + env->GetStaticMethodID(cls, "getExternalStoragePublicDirectory", + "(Ljava/lang/String;)Ljava/io/File;"); +} + +void +Environment::Deinitialise(JNIEnv *env) +{ + cls.Clear(env); +} + +static jstring +ToAbsolutePathChecked(JNIEnv *env, jobject file) +{ + if (file == nullptr) + return nullptr; + + jstring path = Java::File::getAbsolutePath(env, file); + env->DeleteLocalRef(file); + return path; +} + +static jstring +Environment::getExternalStorageDirectory(JNIEnv *env) +{ + jobject file = env->CallStaticObjectMethod(cls, + getExternalStorageDirectory_method); + return ToAbsolutePathChecked(env, file); +} + +char * +Environment::getExternalStorageDirectory(char *buffer, size_t max_size) +{ + JNIEnv *env = Java::GetEnv(); + + jstring value = getExternalStorageDirectory(env); + if (value == nullptr) + return nullptr; + + Java::String value2(env, value); + value2.CopyTo(env, buffer, max_size); + return buffer; +} + +static jstring +getExternalStoragePublicDirectory(JNIEnv *env, const char *type) +{ + if (Environment::getExternalStoragePublicDirectory_method == nullptr) + /* needs API level 8 */ + return nullptr; + + Java::String type2(env, type); + jobject file = env->CallStaticObjectMethod(Environment::cls, + Environment::getExternalStoragePublicDirectory_method, + type2.Get()); + return ToAbsolutePathChecked(env, file); +} + +char * +Environment::getExternalStoragePublicDirectory(char *buffer, size_t max_size, + const char *type) +{ + JNIEnv *env = Java::GetEnv(); + jstring path = ::getExternalStoragePublicDirectory(env, type); + if (path == nullptr) + return nullptr; + + Java::String path2(env, path); + path2.CopyTo(env, buffer, max_size); + return buffer; +} diff --git a/src/android/Environment.hxx b/src/android/Environment.hxx new file mode 100644 index 000000000..d2b02d1e9 --- /dev/null +++ b/src/android/Environment.hxx @@ -0,0 +1,43 @@ +/* +Copyright_License { + + XCSoar Glide Computer - http://www.xcsoar.org/ + Copyright (C) 2000-2013 The XCSoar Project + A detailed list of copyright holders can be found in the file "AUTHORS". + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +*/ + +#ifndef MPD_ANDROID_ENVIRONMENT_HXX +#define MPD_ANDROID_ENVIRONMENT_HXX + +#include <jni.h> +#include <stddef.h> + +namespace Environment { + void Initialise(JNIEnv *env); + void Deinitialise(JNIEnv *env); + + /** + * Determine the mount point of the external SD card. + */ + char *getExternalStorageDirectory(char *buffer, size_t max_size); + + char *getExternalStoragePublicDirectory(char *buffer, size_t max_size, + const char *type); +}; + +#endif |