diff --git a/project/java/MainActivity.java b/project/java/MainActivity.java
index c1e371d5c..b77d518d8 100644
--- a/project/java/MainActivity.java
+++ b/project/java/MainActivity.java
@@ -598,6 +598,7 @@ public class MainActivity extends Activity
public void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);
cloudSave.onActivityResult(request, response, data);
+ SettingsMenuMisc.StorageAccessConfig.onActivityResult(this, request, response, data);
}
private int TextInputKeyboardList[][] =
diff --git a/project/java/SettingsMenu.java b/project/java/SettingsMenu.java
index c1ceddf12..57233f7f8 100644
--- a/project/java/SettingsMenu.java
+++ b/project/java/SettingsMenu.java
@@ -248,6 +248,7 @@ class SettingsMenu
new SettingsMenuKeyboard.ScreenGesturesConfig(),
new SettingsMenuMisc.VideoSettingsConfig(),
new SettingsMenuMisc.CommandlineConfig(),
+ new SettingsMenuMisc.StorageAccessConfig(),
new SettingsMenuMisc.ResetToDefaultsConfig(),
new OkButton(),
};
diff --git a/project/java/SettingsMenuMisc.java b/project/java/SettingsMenuMisc.java
index 68d813e16..ed7b56bb9 100644
--- a/project/java/SettingsMenuMisc.java
+++ b/project/java/SettingsMenuMisc.java
@@ -542,6 +542,42 @@ class SettingsMenuMisc extends SettingsMenu
}
}
+ public static class StorageAccessConfig extends Menu
+ {
+ public static int REQUEST_STORAGE_ID = 42;
+
+ public static void onActivityResult(final MainActivity p, final int requestCode, final int resultCode, final Intent resultData)
+ {
+ if (requestCode == REQUEST_STORAGE_ID)
+ {
+ if (resultCode == Activity.RESULT_OK)
+ {
+ Uri treeUri = resultData.getData();
+ p.getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ Log.i("SDL", "Storage write permission granted to path " + treeUri.toString());
+ }
+ else
+ {
+ Log.i("SDL", "Storage write permission rejected");
+ }
+ }
+ }
+
+ String title(final MainActivity p)
+ {
+ return p.getResources().getString(R.string.storage_access);
+ }
+ void run (final MainActivity p)
+ {
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP)
+ {
+ p.startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), REQUEST_STORAGE_ID);
+ }
+
+ goBack(p);
+ }
+ }
+
static class CommandlineConfig extends Menu
{
String title(final MainActivity p)
diff --git a/project/java/googleplaygameservices/CloudSave.java b/project/java/googleplaygameservices/CloudSave.java
index e91e9ca4d..5983c8d55 100644
--- a/project/java/googleplaygameservices/CloudSave.java
+++ b/project/java/googleplaygameservices/CloudSave.java
@@ -41,6 +41,7 @@ public class CloudSave implements GameHelper.GameHelperListener {
// The game helper object. This class is mainly a wrapper around this object.
protected GameHelper mHelper;
+ public int REQUEST_CLOUD_SAVE_ID = 38;
MainActivity parent;
@@ -72,6 +73,8 @@ public class CloudSave implements GameHelper.GameHelperListener {
boolean createNewSave = false;
public void onActivityResult(int request, int response, Intent intent)
{
+ if (request != REQUEST_CLOUD_SAVE_ID)
+ return;
Log.d("SDL", "CloudSave: onActivityResult() response " + response + " intent " + (intent != null));
try
{
@@ -119,7 +122,7 @@ public class CloudSave implements GameHelper.GameHelperListener {
{
public void run()
{
- parent.startActivityForResult(snapshotIntent, 0);
+ parent.startActivityForResult(snapshotIntent, REQUEST_CLOUD_SAVE_ID);
}
});
semaphore.acquireUninterruptibly();
@@ -192,7 +195,7 @@ public class CloudSave implements GameHelper.GameHelperListener {
{
public void run()
{
- parent.startActivityForResult(snapshotIntent, 0);
+ parent.startActivityForResult(snapshotIntent, REQUEST_CLOUD_SAVE_ID);
}
});
semaphore.acquireUninterruptibly();
diff --git a/project/java/translations/values-ru/strings.xml b/project/java/translations/values-ru/strings.xml
index 5cdf50521..87397a16e 100644
--- a/project/java/translations/values-ru/strings.xml
+++ b/project/java/translations/values-ru/strings.xml
@@ -16,6 +16,7 @@
Внутреннее хранение - %d Мб
SD карта - %d Мб
Куда сохранять данные приложения
+Разрешение на запись на SD карту
Дополнительные загрузки
Продолжить
Стрелки / джойстик / Dpad
diff --git a/project/java/translations/values-uk/strings.xml b/project/java/translations/values-uk/strings.xml
index d45a4c2cf..5c7ff45b1 100644
--- a/project/java/translations/values-uk/strings.xml
+++ b/project/java/translations/values-uk/strings.xml
@@ -16,6 +16,7 @@
Внутрішнє зберігання - %d Мб
SD карта - %d Мб
Куди зберігати дані програми
+Дозвіл на запис на SD карту
Додаткові завантаження
ОК
Стрілки / джойстік / Dpad
diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml
index 586d67de1..f421cf504 100644
--- a/project/java/translations/values/strings.xml
+++ b/project/java/translations/values/strings.xml
@@ -26,6 +26,7 @@
Specify directory
Command line parameters, one argument per line
Data installation location
+ Permission to write to SD card
Downloads
Downloads
OK
diff --git a/project/jni/application/ballfield/ballfield.c b/project/jni/application/ballfield/ballfield.c
index 858833471..5abc00c3f 100644
--- a/project/jni/application/ballfield/ballfield.c
+++ b/project/jni/application/ballfield/ballfield.c
@@ -587,8 +587,26 @@ int main(int argc, char* argv[])
//SDL_ANDROID_SetScreenKeyboardButtonGenerateTouchEvents(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, 1);
//SDL_ANDROID_SetScreenKeyboardButtonGenerateTouchEvents(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, 1);
- create_server_socket(6000);
-
+ {
+ // Write to SD card
+ FILE * ff = fopen("/storage/C164-1DEC/ballfield.txt", "wb");
+ if (ff)
+ {
+ fputs("Ballfield!\n", ff);
+ fclose(ff);
+ }
+ }
+
+ {
+ // Write to shared storage
+ FILE * ff = fopen("/storage/emulated/0/ballfield2.txt", "wb");
+ if (ff)
+ {
+ fputs("Ballfield!\n", ff);
+ fclose(ff);
+ }
+ }
+
while(1)
{
SDL_Rect r;
diff --git a/project/jni/application/ballfield/socket.c b/project/jni/application/ballfield/socket.c
deleted file mode 100644
index 6a83f1040..000000000
--- a/project/jni/application/ballfield/socket.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-#define fprintf(X, ...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__)
-#define printf(...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__)
-
-
-
-void error(const char *msg)
-{
- perror(msg);
- __android_log_print(ANDROID_LOG_ERROR, "Ballfield", "%s", msg);
- exit(1);
-}
-
-int create_server_socket(int portno)
-{
- int sockfd, newsockfd;
- socklen_t clilen;
- char buffer[256];
- struct sockaddr_in serv_addr, cli_addr;
- int n;
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd < 0) error("ERROR opening socket");
- bzero((char *) &serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- serv_addr.sin_port = htons(portno);
- if (bind(sockfd, (struct sockaddr *) &serv_addr,
- sizeof(serv_addr)) < 0) error("ERROR on binding");
- listen(sockfd,5);
- __android_log_print(ANDROID_LOG_INFO, "Ballfield", "Opened TCP socket %d port %d", sockfd, portno);
- return 0;
- /*
- clilen = sizeof(cli_addr);
- newsockfd = accept(sockfd,
- (struct sockaddr *) &cli_addr,
- &clilen);
- if (newsockfd < 0)
- error("ERROR on accept");
- bzero(buffer,256);
- n = read(newsockfd,buffer,255);
- if (n < 0) error("ERROR reading from socket");
- printf("Here is the message: %s\n",buffer);
- n = write(newsockfd,"I got your message",18);
- if (n < 0) error("ERROR writing to socket");
- close(newsockfd);
- close(sockfd);
- return 0;
- */
-}