4package org.qtproject.qt.android;
6import android.content.ContentResolver;
7import android.content.Context;
8import android.content.Intent;
9import android.content.pm.PackageManager;
10import android.content.pm.ProviderInfo;
12import android.database.Cursor;
14import android.net.Uri;
16import android.util.Log;
18import android.os.ParcelFileDescriptor;
19import android.os.Process;
21import java.util.Arrays;
22import java.util.stream.Collectors;
24class QtContentFileEngine
26 private static String QtTag =
"QtContentFileEngine";
28 static Cursor
query(ContentResolver contentResolver, Uri uri,
String[] projection,
33 if (!hasPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION))
36 return contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
37 }
catch (Exception ignored) {
46 static ParcelFileDescriptor openFileDescriptor(ContentResolver contentResolver,
51 if (openMode.contains(
"w"))
52 permissions |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
53 if (openMode.contains(
"r"))
54 permissions |= Intent.FLAG_GRANT_READ_URI_PERMISSION;
56 if (!hasPermission(uri, permissions)) {
57 Log.w(QtTag,
"openFileDescriptor(): No permission for URI " + uri);
61 return contentResolver.openFileDescriptor(uri, openMode);
62 }
catch (Exception e) {
63 Log.w(QtTag,
"openFileDescriptor() failed with " + e);
69 static boolean hasPermission(Uri uri,
int permission)
72 int status =
context.checkUriPermission(uri, Process.myPid(), Process.myUid(), permission);
73 if (status == PackageManager.PERMISSION_GRANTED)
77 final String authority = uri.getAuthority();
78 if (authority !=
null) {
79 final PackageManager pm =
context.getPackageManager();
80 final ProviderInfo provider = pm.resolveContentProvider(authority, 0);
81 if (provider !=
null &&
context.getPackageName().equals(provider.packageName))
static const QString context()