1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-05 12:10:55 +00:00

Implement file provider capabilities

The previously used file sharing api was restricted after Android N causing the engine to crash whenever used on devices running Android N or higher.
This commit is contained in:
Fredia Huya-Kouadio
2023-01-26 14:03:04 -08:00
parent f7397a5ac6
commit bdbeb0772f
4 changed files with 52 additions and 11 deletions

View File

@@ -49,6 +49,9 @@ import android.view.Display;
import android.view.DisplayCutout;
import android.view.WindowInsets;
import androidx.core.content.FileProvider;
import java.io.File;
import java.util.List;
import java.util.Locale;
@@ -84,29 +87,42 @@ public class GodotIO {
// MISCELLANEOUS OS IO
/////////////////////////
public int openURI(String p_uri) {
public int openURI(String uriString) {
try {
String path = p_uri;
String type = "";
if (path.startsWith("/")) {
//absolute path to filesystem, prepend file://
path = "file://" + path;
if (p_uri.endsWith(".png") || p_uri.endsWith(".jpg") || p_uri.endsWith(".gif") || p_uri.endsWith(".webp")) {
type = "image/*";
Uri dataUri;
String dataType = "";
boolean grantReadUriPermission = false;
if (uriString.startsWith("/") || uriString.startsWith("file://")) {
String filePath = uriString;
// File uris needs to be provided via the FileProvider
grantReadUriPermission = true;
if (filePath.startsWith("file://")) {
filePath = filePath.replace("file://", "");
}
File targetFile = new File(filePath);
dataUri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".fileprovider", targetFile);
dataType = activity.getContentResolver().getType(dataUri);
} else {
dataUri = Uri.parse(uriString);
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
if (!type.equals("")) {
intent.setDataAndType(Uri.parse(path), type);
if (TextUtils.isEmpty(dataType)) {
intent.setData(dataUri);
} else {
intent.setData(Uri.parse(path));
intent.setDataAndType(dataUri, dataType);
}
if (grantReadUriPermission) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
activity.startActivity(intent);
return 0;
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Unable to open uri " + uriString, e);
return 1;
}
}