Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
QtContentFileEngine.java
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4package org.qtproject.qt.android;
5
6import android.content.ContentResolver;
7import android.content.Context;
8import android.content.Intent;
9import android.content.pm.PackageManager;
10import android.content.pm.ProviderInfo;
11
12import android.database.Cursor;
13
14import android.net.Uri;
15
16import android.util.Log;
17
18import android.os.ParcelFileDescriptor;
19import android.os.Process;
20
21import java.util.Arrays;
22import java.util.stream.Collectors;
23
24class QtContentFileEngine
25{
26 private static String QtTag = "QtContentFileEngine";
27
28 static Cursor query(ContentResolver contentResolver, Uri uri, String[] projection,
29 String selection, String[] selectionArgs, String sortOrder)
30 {
31 try {
32 // Check for read permission before doing any query
33 if (!hasPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION))
34 return null;
35
36 return contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
37 } catch (Exception ignored) {
38 // Uncomment for debug only
39 // String projections = Arrays.stream(projection).collect(Collectors.joining(", "));
40 // Log.w(QtTag, "Query for [" + projections + "] failed with " + ignored);
41 }
42
43 return null;
44 }
45
46 static ParcelFileDescriptor openFileDescriptor(ContentResolver contentResolver,
47 Uri uri, String openMode)
48 {
49 try {
50 int permissions = 0;
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;
55 // Check for relevant permission before attempting to obtain a file description
56 if (!hasPermission(uri, permissions)) {
57 Log.w(QtTag, "openFileDescriptor(): No permission for URI " + uri);
58 return null;
59 }
60
61 return contentResolver.openFileDescriptor(uri, openMode);
62 } catch (Exception e) {
63 Log.w(QtTag, "openFileDescriptor() failed with " + e);
64 }
65
66 return null;
67 }
68
69 static boolean hasPermission(Uri uri, int permission)
70 {
71 Context context = QtNative.getContext();
72 int status = context.checkUriPermission(uri, Process.myPid(), Process.myUid(), permission);
73 if (status == PackageManager.PERMISSION_GRANTED)
74 return true;
75
76 // No permission is needed to access an app's own content provider.
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))
82 return true;
83 }
84 return false;
85 }
86}
QPainter Context
static const QString context()
Definition java.cpp:396
GLenum query
[36]