├── AndroidManifest.template.xml
├── README.md
├── Unit1.fmx
├── Unit1.pas
├── addp_SAF.deployproj
├── addp_SAF.dpr
├── addp_SAF.dproj
├── addp_SAF.dproj.local
├── addp_SAF.identcache
├── addp_SAF.res
└── delphican.pdf
/AndroidManifest.template.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 | <%uses-permission%>
11 |
12 |
22 |
23 | <%provider%>
24 | <%application-meta-data%>
25 | <%uses-libraries%>
26 | <%services%>
27 |
29 |
33 |
34 |
36 |
37 |
38 |
39 |
40 |
41 | <%activity%>
42 | <%receivers%>
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Delphi - Android Scoped Storage : Storage Access Framework SAF API
2 |
3 | 
4 | 
5 | 
6 | 
7 |
8 |
9 |
10 |
11 |
12 | [Privacy changes in Android 10](https://developer.android.com/about/versions/10/privacy/changes)
13 |
14 | [Android 11 - Privacy and security](https://en.wikipedia.org/wiki/Android_11)
15 |
16 | [Behavior changes: Apps targeting Android 11 - Privacy](https://developer.android.com/about/versions/11/behavior-changes-11)
17 |
18 | [Use of All files access (MANAGE_EXTERNAL_STORAGE) permission](https://support.google.com/googleplay/android-developer/answer/10467955?hl=en)
19 |
20 | [Overview of shared storage](https://developer.android.com/training/data-storage/shared)
21 |
22 |
23 |
24 |
25 |
26 | ## Scoped Storage
27 |
28 | After Android 10 and 11 privacy and security changes, direct access to storage by applications scoped to internal only and now accessing to external files possible purely and simply by 4 APIs:
29 |
30 | 1. Storage Access Framework (SAF)
31 | 2. MediaStore API
32 | 3. All Files Access API
33 | 4. Shared Databases API
34 |
35 | All Files Access API (MANAGE_EXTERNAL_STORAGE - ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION permission and ACTION_MANAGE_STORAGE intent) available for only file manager and antivirus type apps, all other type apps are rejected by Google Play Store publishing.
36 | Databases (BlobStoreManager) API runs only Android 11 SDK 30 and upper versions, not Android 10 and previous ones. Therefore both APIs excluded below subject.
37 |
38 |
39 | ## Storage Access Framework (SAF)
40 |
41 | **[Open files using storage access framework](https://developer.android.com/guide/topics/providers/document-provider)**
42 |
43 | **[Access documents and other files from shared storage](https://developer.android.com/training/data-storage/shared/documents-files)**
44 |
45 | **Use cases for accessing documents and other files**
46 |
47 | The Storage Access Framework supports the following use cases for accessing files and other documents.
48 |
49 | **Create a new file**
50 |
51 | The ACTION_CREATE_DOCUMENT intent action allows users to save a file in a specific location.
52 |
53 | **Open a document or file**
54 |
55 | The ACTION_OPEN_DOCUMENT intent action allows users to select a specific document or file to open.
56 |
57 | **Grant access to a directory's contents**
58 |
59 | The ACTION_OPEN_DOCUMENT_TREE intent action, available on Android 5.0 (API level 21) and higher, allows users to select a specific directory, granting your app access to all of the files and sub-directories within that directory.
60 |
61 | The following sections provide guidance on how to configure each use case.
62 |
63 |
64 | ### Delphi codes in Access documents and other files from shared storage
65 |
66 | [Create a new file](https://developer.android.com/training/data-storage/shared/documents-files#create-file)
67 |
68 | ```delphi
69 | // Request code for creating a PDF document.
70 | const CREATE_FILE : integer = 11; //CREATE_FILE = 1
71 |
72 | procedure createFile(pickerInitialUri : JNet_Uri); (* PdfDosyasiOlustur *)
73 | var
74 | Intent : JIntent;
75 | begin
76 | Intent := TJIntent.Create;
77 | Intent.setAction(TJIntent.JavaClass.ACTION_CREATE_DOCUMENT);
78 | Intent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
79 | Intent.setType(StringToJString('application/pdf'));
80 | Intent.putExtra(TJIntent.JavaClass.EXTRA_TITLE,StringToJString('invoice.pdf'));
81 |
82 | // Optionally, specify a URI for the directory that should be opened in
83 | // the system file picker when your app creates the document.
84 | Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI,JParcelable(pickerInitialUri));
85 |
86 | MainActivity.startActivityForResult(Intent, CREATE_FILE);
87 | end;
88 | ```
89 |
90 |
91 | [Open a file](https://developer.android.com/training/data-storage/shared/documents-files#open-file)
92 |
93 | ```delphi
94 | // Request code for selecting a PDF document.
95 | // const PICK_PDF_FILE : integer = 22; //PICK_PDF_FILE = 2
96 |
97 | procedure openFile(pickerInitialUri : JNet_Uri); (* PdfDosyasiSec *)
98 | var
99 | Intent: JIntent;
100 | begin
101 | Intent := TJIntent.Create;
102 | Intent.setAction(TJIntent.JavaClass.ACTION_OPEN_DOCUMENT);
103 | Intent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
104 | Intent.setType(StringToJString('application/pdf'));
105 |
106 | // Optionally, specify a URI for the file that should appear in the
107 | // system file picker when it loads.
108 | Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI,JParcelable(pickerInitialUri));
109 |
110 | TAndroidHelper.Activity.startActivityForResult(Intent, PICK_PDF_FILE);
111 | end;
112 | ```
113 |
114 |
115 | [Grant access to a directory's contents](https://developer.android.com/training/data-storage/shared/documents-files#grant-access-directory)
116 |
117 | ```delphi
118 | procedure openDirectory(uriToLoad : JNet_Uri); (* DizinAc *)
119 | // Choose a directory using the system's file picker.
120 | var
121 | Intent : JIntent;
122 | begin
123 | Intent := TJIntent.Create;
124 | Intent.setAction(TJIntent.JavaClass.ACTION_OPEN_DOCUMENT_TREE);
125 |
126 | // Optionally, specify a URI for the directory that should be opened in
127 | // the system file picker when it loads.
128 | Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI, JParcelable(uriToLoad));
129 |
130 | Mainactivity.startActivityForResult(Intent, Open_Doc_Tree);
131 | end;
132 | ```
133 |
134 |
135 | [Perform operations on chosen location](https://developer.android.com/training/data-storage/shared/documents-files#perform-operations)
136 |
137 | ```delphi
138 | procedure TForm1.HandleMessageAction(const Sender: TObject; const M: TMessage); (* IletiFaaliyetiYakala *)
139 | begin
140 | if M is TMessageResultNotification then
141 | OnActivityResult(
142 | TMessageResultNotification(M).RequestCode,
143 | TMessageResultNotification(M).ResultCode,
144 | TMessageResultNotification(M).Value);
145 | end;
146 |
147 | procedure TForm1.OnActivityResult(RequestCode, ResultCode: Integer;
148 | Data: JIntent);
149 | var
150 | Uri: Jnet_Uri;
151 | begin
152 | if ResultCode = TJActivity.JavaClass.RESULT_OK then
153 | begin
154 | // The result data contains a URI for the document or directory that
155 | // the user selected.
156 | Uri := nil;
157 | if Assigned(Data) then
158 | begin
159 | Uri := Data.getData;
160 | if RequestCode = your-request-code then
161 | begin
162 | // Perform operations on the document using its URI.
163 | end;
164 | end;
165 | end;
166 | ```
167 |
168 |
169 | By getting a reference to the selected item's URI, your app can perform several operations on the item. For example, you can access the item's metadata, edit the item in place, and delete the item.
170 | The following sections show how to complete actions on the files that the user selects:
171 |
172 | [Persist permissions](https://developer.android.com/training/data-storage/shared/documents-files#persist-permissions)
173 |
174 | ```delphi
175 | // TakeFlags: integer;
176 | Intent := TJIntent.Create;
177 | TakeFlags := Intent.getFlags
178 | and (TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION
179 | or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION);
180 | // Check for the freshest data.
181 | TAndroidHelper.Activity.getContentResolver.takePersistableUriPermission
182 | (Uri, TakeFlags);
183 | ```
184 |
185 |
186 | [Examine document metadata](https://developer.android.com/training/data-storage/shared/documents-files#examine-metadata)
187 |
188 | ```delphi
189 | procedure dumpImageMetaData(uri : JNet_Uri); (* GoruntuMetaVerisiDokumu *)
190 | // The query, because it only applies to a single document, returns only
191 | // one row. There's no need to filter, sort, or select fields,
192 | // because we want all fields for one document.
193 | var
194 | displayName, size : JString;
195 | sizeIndex : integer;
196 | cursor : JCursor;
197 | begin
198 | cursor := TAndroidHelper.Activity.getContentResolver.query(uri,nil,nil,nil,nil,nil);
199 | try
200 | // moveToFirst() returns false if the cursor has 0 rows. Very handy for
201 | // "if there's anything to look at, look at it" conditionals.
202 | if (cursor<>nil) then
203 | if (cursor.moveToFirst) then
204 | begin
205 | displayName := cursor.getString (cursor.getColumnIndex (TJOpenableColumns.JavaClass.DISPLAY_NAME));
206 | Memo1.Lines.Add({TAG.ToString +} 'Display Name: ' + JStringToString (displayName));
207 | sizeIndex:=cursor.getColumnIndex(TJOpenableColumns.JavaClass.SIZE);
208 | size := nil;
209 | if not (cursor.isNull(sizeIndex)) then
210 | size := cursor.getString(sizeIndex)
211 | else
212 | size:=StringToJString ('Unknown');
213 | Memo1.Lines.Add({TAG.ToString +} 'Size: ' + JStringToString (size));
214 | end;
215 | finally
216 | cursor.close;
217 | end;
218 | end;
219 | ```
220 |
221 |
222 | [Open a document - Bitmap](https://developer.android.com/training/data-storage/shared/documents-files#open)
223 |
224 | ```delphi
225 | function getBitmapFromUri(uri : JNet_Uri): JBitmap; (* UridenBiteslemAl *)
226 | var
227 | fileDescriptor : JFileDescriptor;
228 | parcelFileDescriptor : JParcelFileDescriptor;
229 | image : JBitmap;
230 | begin
231 | Result := nil;
232 | try
233 | parcelFileDescriptor := TAndroidHelper.Activity
234 | .getContentResolver.openFileDescriptor(uri,StringToJString('r'));
235 | fileDescriptor := parcelFileDescriptor.getFileDescriptor;
236 | image := TJBitmapFactory.JavaClass.decodeFileDescriptor(fileDescriptor);
237 | parcelFileDescriptor.close;
238 | result := image;
239 | except
240 | on E: Exception do
241 | ShowMessage(e.Message);
242 | end;
243 | ```
244 |
245 |
246 | [Open a document - Input stream](https://developer.android.com/training/data-storage/shared/documents-files#input_stream)
247 |
248 | ```delphi
249 | function TForm1.readTextFromUri(Uri : JNet_Uri): string; (* MetinDosyasiOkuyucu *)
250 | const
251 | bufferSize = 4096*2;
252 | var
253 | inputStream : JInputStream;
254 | b : TJavaArray;
255 | ms: TMemoryStream;
256 | sl: TStringList;
257 | bufflen: Integer;
258 | begin
259 | result := '';
260 | try
261 | inputStream := TAndroidHelper.Context.getContentResolver.openInputStream(Uri);
262 | ms := TMemoryStream.Create;
263 | bufflen := inputStream.available;
264 | b := TJavaArray.Create(bufflen);
265 | inputStream.read(b);
266 | ms.Write(b.Data^, bufflen);
267 | ms.position := 0;
268 | sl := TStringList.Create;
269 | sl.LoadFromStream(ms);
270 | result := sl.Text;
271 | sl.Free;
272 | b.Free;
273 | ms.Free;
274 | inputStream.Close;
275 | except
276 | on E: Exception do
277 | Application.ShowException(E);
278 | end;
279 | end;
280 | ```
281 |
282 |
283 | [Edit a document](https://developer.android.com/training/data-storage/shared/documents-files#edit)
284 |
285 | ```delphi
286 | procedure alterDocument(uri : JNet_Uri); (* MetinBelgesiDegistir *)
287 | var
288 | pfd : JParcelFileDescriptor;
289 | fileOutputStream : JFileOutputStream;
290 | begin
291 | try
292 | pfd := TAndroidHelper.Activity.getContentResolver
293 | .openFileDescriptor(uri,StringToJString('w'));
294 | fileOutputStream := TJFileOutputStream.JavaClass.init(pfd.getFileDescriptor);
295 | fileOutputStream.write(StringToJString('Overwritten at ' + timetostr(Now)).getBytes);
296 | fileOutputStream.close;
297 | pfd.close;
298 | except
299 | on E: Exception do
300 | ShowMessage(e.Message);
301 | end;
302 | end;
303 | ```
304 |
305 |
306 | [Delete a document](https://developer.android.com/training/data-storage/shared/documents-files#delete)
307 |
308 | ```delphi
309 | TJDocumentsContract.JavaClass.deleteDocument (TAndroidHelper.contentResolver, Uri);
310 | ```
311 |
312 |
313 | [Open a virtual file](https://developer.android.com/training/data-storage/shared/documents-files#open-virtual-file)
314 |
315 | ```delphi
316 | function isVirtualFile(Uri : JNet_Uri): boolean; (* SanalDosyami *)
317 | var
318 | flags : integer;
319 | cursor : JCursor;
320 | s : TJavaObjectArray;
321 | begin
322 | if (not TJDocumentsContract.JavaClass.isDocumentUri(TAndroidHelper.Context,Uri)) then
323 | begin
324 | result := false;
325 | exit;
326 | end;
327 | s := TJavaObjectArray.Create(0);
328 | s[0] := TJDocumentsContract_Document.JavaClass.COLUMN_FLAGS;
329 | cursor := TAndroidHelper.Activity.getContentResolver.query(uri,s,nil,nil,nil);
330 | flags:=0;
331 | if (cursor.moveToFirst) then
332 | flags:=cursor.getInt(0);
333 | cursor.close;
334 | result := (flags and TJDocumentsContract_Document.JavaClass.FLAG_VIRTUAL_DOCUMENT) <> 0;
335 | end;
336 | ```
337 |
338 |
339 | [virtual file as image](https://developer.android.com/training/data-storage/shared/documents-files#open-virtual-file)
340 |
341 | ```delphi
342 | function getInputStreamForVirtualFile(Uri : JNet_Uri; mimeTypeFilter : String): JInputStream; (* SanalDosyaIcinGirisAkisiAl *)
343 | var
344 | openableMimeTypes : TJavaObjectArray;
345 | resolver : JContentResolver;
346 | begin
347 | resolver := TAndroidHelper.Activity.getContentResolver;
348 | openableMimeTypes := resolver.getStreamTypes(uri,StringToJString(mimeTypeFilter));
349 | if ((openableMimeTypes = nil) or (openableMimeTypes.Length < 1)) then
350 | begin
351 | raise Exception.Create('File not found!');
352 | result := nil;
353 | exit;
354 | end;
355 | result := resolver.openTypedAssetFileDescriptor(uri,openableMimeTypes[0],nil)
356 | .createInputStream;
357 | end;
358 | ```
359 |
360 |
361 | ## Current Delphi - Android File Storage Details
362 |
363 | [Standard RTL Path Functions across the Supported Target Platforms: Internal Storage, External Private internal S, Shared External Storage](https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms)
364 |
365 | Storage Changes in Android Versions
366 |
367 | | # | Code | SDK | Publish | Change |
368 | |-----|------|-------|----------|-----------------------------------------------------------------------------|
369 | | 1 | - | 1 | 23.09.08 | Intent, System picker (Action_) started in first version |
370 | | 4.4 | K | 19 | 31.10.13 | FileProvider (Content API), DocumentsContract, DocumentProvider classes |
371 | | 7 | N | 25 | 04.10.16 | FileProvider usage mandatory (when targeted this version) |
372 | | 8 | O | 26 | 21.03.17 | August 2018 Google Play Store And. 8.0 publishing requirement |
373 | | 10 | Q | 29 | 03.09.19 | Scoped storage. Privacy and security increased |
374 | | 11 | R | 30 | 09.09.20 | August 2021 targeting Android API 30 (Google Play Store publish requirement)|
375 |
376 |
377 | [Document Provider, Android 4.3 ACTION_PICK, ACTION_GET_CONTENT; Android 4.4 (API 19) ACTION_OPEN_DOCUMENT; Android 5.0 (API 21) ACTION_OPEN_DOCUMENT_TREE](https://developer.android.com/guide/topics/providers/document-provider)
378 |
379 |
380 | **Android Support in Delphi Versions**
381 |
382 | RAD Studio Delphi 10+ versions accompany Android 10+ Java libraries (Androidapi.JNI.GraphicsContentViewText, Androidapi.IOUtils, Androidapi.JNI.Media, Androidapi.JNI.Provider, Androidapi.JNI.App, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.JNI.Provider) supporting scoped storage, SAF and some MediaStore commands.
383 |
384 | |Delphi | Android |
385 | |---------------|---------------|
386 | | XE5 | 2.33 – 4.4 |
387 | | 10 Seattle | 4.03 – 5 |
388 | | 10.1 Berlin | 4.03 – 7 |
389 | | 10.2 Tokyo | 4.1 – 8 |
390 | | 10.3 Rio | 5.1 – 10 |
391 | | 10.4 Sydney | 6 – 11 |
392 | | 11 Alexandria | 8.1 – 11 |
393 |
394 | RAD Studio Delphi 11.0 Alexandria has Android 30 API support (Google Play Store 2021 requirement).
395 |
396 |
397 | ## Scoped Storage in Practice
398 |
399 | **Differences to [File Storage and Sharing in Android](https://www.delphican.com/showthread.php?tid=5296) :**
400 |
401 | • There is no difference in Android 11 for internal storage. As in Android 10 and earlier, access to files is unlimited. Again, no permission is required.
402 |
403 | • File sharing is the same, again Content API (FileProvider) and way of calling with “Intent.setAction(TJIntent.JavaClass.ACTION_SEND);” intent continues. To enable FileProvider feature, selecting "Secure File Sharing" option in Project Options->Application->Entitlement List (available in Delphi 10.3 Rio and later) should be added to continue to use this API. For Delphi 10.3 earlier versions, FileProvider API should be added manually as explained in "File Storage and Sharing in Android" > “Using FileProvider for File Sharing”.
404 |
405 | • External Storage copy commands in "File Storage and Sharing in Android" sample project run when targeted Android 10 SDK 29 earlier versions, i.e. “Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDownloadsPath, 'memo1External.txt'));”. When Android 11 SDK 30 targeted, same app raises “Cannot create file “(storage/emulated/0/Download/memo1External.txt”. Permission denied” exception. “DeleteFile” command does not delete files under Download / GetSharedDownloadsPath folder. Same problem valid for all Shared External folders. The reason is Android 11 restrictions as stated above.
406 |
407 | • Current status before Android 10 and after Android 11 mandatory Scoped Storage File storage changes:
408 |
409 | • “requestLegacyExternalStorage” has been removed from Scope Storage and now applications that want to access it are rejected in the G.P.Store. To publish your app, make the following change in AndroidManifest.template.xml::
410 |
411 | ```
412 | android:requestLegacyExternalStorage="false">
413 | ```
414 |
415 | • All Files Access API (ACTION_MANAGE_STORAGE) is rejected by Google Play Store, but if this permission is granted (and the app will not be published), it can read and save files as before Android 11. If you need this, you need to add under "AndroidManifest.template.xml" and request "ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION" at runtime and call the ACTION_MANAGE_STORAGE intent.
416 |
417 | • Shared Databases BlobStoreManager API works only on Android 11 SDK 30 and above, does not work on Android 10 and earlier versions.
418 |
419 | • Shared Databases BlobStoreManager API runs only Android 11 SDK 30 and higher versions, does not run Android 10 and lower versions. It is not included consideration since it is not supported by most of the devices currently.
420 |
421 | • Accessing Shared (External) Storage with SAF and MediaStore:
422 |
423 |
424 | • Getting URI: Only the first three examples of Use Cases from the training codes above get both file Uri and permission to access them. Accessing external file URIs is introduced by capturing their actions with OnActivityResult.
425 |
426 | • All of the other examples describe how to deal with URIs obtained from these 3 use cases actions. If you don't know the File Uri, you cannot use them.
427 |
428 | • Also, the old ACTION_GET_CONTENT intent can be used to get a Uri by calling the System Selector, similar to ACTION_OPEN_DOCUMENT; but it does not provide permanent access.
429 |
430 | • With MediaStore.Files, the Uri of the files in the media storage can also be retrieved, but it was not included in the content of this topic due to the statement “The content of MediaStore.Files in the media store also depends on whether your application uses the extensive storage available in applications targeting Android 10 or higher”. Although the MediaStore.Downloads and getMediaUri classes also provide access to external storage file Uri, they only support SDK 29 and above.
431 |
432 | • E If you want to operate on a file with any code without using a case, you can directly use a file Uri (eg: content://com.android.providers.downloads.documents/documents/16874) with the "java.lang.SecurityException: Permission" Denial: reading ... requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs” error message and you cannot access the file.
433 |
434 | • Briefly, external storage file recording apps in Scope Storage are in Uri bottleneck. Moreover, if you want to cover all Android devices on the market using older versions prior to SDK 29, you have to use SAF use cases, there is no way out other than that. In Android Developer conference, video, announcements, they claim that the purpose of switching to Scope Storage is to remove unnecessary permissions, but in reality, the opposite has happened for developers and users.
435 |
436 | • The sample codes (all on the SAF tutorials and most on the MediaStore) are SDK level 1-24 and are supported by Delphi 10.x versions.
437 |
438 | • Delphi 11 is required to use SDK levels 29 ve 30 MediaStore commands of “Downloads”, “getMediaUri” classes, Loading thumbnails > loadThumbnail, Add an item > VOLUME_EXTERNAL_PRIMARY, Toggle pending status for media files > IS_PENDING flag, Update other apps' media files > RecoverableSecurityException, Manage groups of media files > createWriteRequest createTrashRequest createFavoriteRequest”.
439 |
440 | • For File Sharing from external storage first getting Uri of file by SAF file picker, then sharing intents required. If external file Uri available, it can be used for new file opening, reading, saving, copying purposes.
441 |
442 | • Depreciated items for external storage:
443 |
444 | ```delphi
445 | // ExternalFile := TPath.Combine(TPath.GetSharedDownloadsPath,'delphican.txt');
446 | Memo1.Lines.SaveToFile(ExternalFile);
447 | TFile.Copy(InternalFile, ExternalFile);
448 | DeleteFile(ExternalFile);
449 | Uri := TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(ExternalFile)));
450 | Uri := TJnet_Uri.JavaClass.parse(StringToJString('file:///' + ExternalFile));
451 | JinputStream1 := TJFileInputStream.JavaClass.init(StringToJString(ExternalFile));
452 | Uri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, LAuthority, TJFile.JavaClass.init(StringToJString(ExternalFile)));
453 | Intent := TJFileProvider.JavaClass.getUriForFile(TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(ExternalFile))));
454 | Uri := TAndroidHelper.JFileToJURI (TJFile.JavaClass.init(StringToJString(ExternalFile)));
455 | Uri := TJFileProvider.JavaClass.getUriForFile(Context, LAuthority, AFile);
456 | ```
457 |
458 | Briefly all of File, Content, FileProvider actions and intents are depreciated.
459 |
460 | (P.S: If permission to access the directory where the file is located is obtained by ACTION_OPEN_DOCUMENT_TREE, it may be possible to access files by these commands, but could not be tried since this intent does not work in Delphi 10.))
461 |
462 | • To use Storage Access Framework SAF, no permissions required to get from Project -> Uses Permissions, all can be closed. Projects does not need any permission i.e. “PermissionsService.RequestPermissions”. All permissions in Sample Project off.
463 |
464 | • To access files with SAF, it is sufficient to simply call Use Cases (ACTION_CREATE_DOCUMENT, ACTION_OPEN_DOCUMENT, ACTION_OPEN_DOCUMENT_TREE) intents. However, each of them opens the System Picker interface, unlike the old TFile.Copy.
465 |
466 | • ACTION_CREATE_DOCUMENT is used to save a new file with an interface similar to "Save As", and ACTION_OPEN_DOCUMENT is used to open, show and modify existing files. ACTION_OPEN_DOCUMENT_TREE is for accessing not only directories but also all files under it.
467 |
468 | • When using SAF, the intent-filter part in AndroidManifest.template.xml is ready with Delphi, there is no need to add another intent.
469 |
470 | ```
471 |
472 |
473 |
474 |
475 | ```
476 |
477 | • SAF Use Cases are immediately available in Delphi projects targeting SDK 30 by simply calling it with the necessary Android libraries and sample codes, since they are built-in with all Delphi 10 versions.
478 |
479 | • Writing to audio, image, video files and Downloads above version 11 is not restricted with Mediastore. I.e. you can save the picture without permission.
480 |
481 | • Media collections can only be read with Permission.
482 |
483 | • ACCESS_MEDIA_LOCATION is required for image location data.
484 |
485 | • PDF, text, etc. Accessing the files available by the "System Picker".
486 |
487 | • “System Picker” is required for reading and writing outside the collection.
488 |
489 | • Project -> Uses Permissions -> WRITE_EXTERNAL_STORAGE option must be turned off on SDK 29. READ_EXTERNAL_STORAGE is required for reading.
490 |
491 | • MediaStore Uri classes are not available in pre-Delphi 11 libraries as they were removed for accessing files above SDK 29. So most of the above MediaStore tutorial codes were just imported from Java to Object Pascal, could not be tried.
492 |
493 | • At runtime, depending on the SDK level of the device, write permission should be requested for (SDK<28) and not for (SDK>=29).
494 |
495 | • AndroidManifest.template.xml changes :
496 |
497 | ```
498 |
499 |
500 | android:requestLegacyExternalStorage="false">
501 | ```
502 |
503 | • MediaStore requires read permission on external storage, not write permission. For compatibility with versions before Android 10, under Project -> Uses Permissions, remove the WRITE_EXTERNAL_STORAGE option and add the following in Manifest:
504 |
505 | ```
506 | <%uses-permission%>
507 |
508 | ```
509 |
510 | • File copying can no longer be performed with a single command (TFile.Copy) from external storage. First we call the Use Case (ACTION_OPEN_DOCUMENT or ACTION_CREATE_DOCUMENT) intent. Then we handle the request code with "HandleMessageActivity" and "OnActivityResult". Finally we write to the file we just opened with the Uri and streams (JInputStream, JFileOutputStream).
511 |
512 |
513 | ### File Sharing
514 |
515 | ```delphi
516 | procedure TForm1.ButtonFileSharingClick(Sender: TObject);
517 | var
518 | Intent: JIntent;
519 | mime: JMimeTypeMap;
520 | ExtToMime: JString;
521 | ExtFile: string;
522 | File: string;
523 | begin
524 | File := File_name(UriCan);
525 | ExtFile := AnsiLowerCase(StringReplace(TPath.GetExtension(File),
526 | '.', '', []));
527 | mime := TJMimeTypeMap.JavaClass.getSingleton();
528 | ExtToMime := mime.getMimeTypeFromExtension(StringToJString(ExtFile));
529 | Intent := TJIntent.Create;
530 | Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
531 | Intent.setDataAndType(UriCan, ExtToMime);
532 | Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, JParcelable(UriCan));
533 | Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
534 | TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(Intent,
535 | StrToJCharSequence('Let''s share: ')));
536 | end;
537 | ```
538 |
539 | ### Copy File Internal -> External
540 |
541 | ```delphi
542 | procedure TForm1.ButtonCopyFileFromInternalToExternalClick(Sender: TObject);
543 | (* TFile.Copy(TPath.Combine(TPath.GetDocumentsPath, 'delphican.pdf'),
544 | TPath.Combine(TPath.GetSharedDownloadsPath, 'delphican.pdf')); *)
545 | procedure CreateFilePdf(pickerInitialUri: JNet_Uri);
546 | var
547 | Intent: JIntent;
548 | begin
549 | Intent := TJIntent.Create;
550 | Intent.setAction(TJIntent.JavaClass.ACTION_CREATE_DOCUMENT);
551 | Intent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
552 | Intent.setType(StringToJString('application/pdf'));
553 | Intent.putExtra(TJIntent.JavaClass.EXTRA_TITLE,
554 | StringToJString(TPath.GetFileName(FileToBeCopied)));
555 | Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI,
556 | JParcelable(pickerInitialUri));
557 | MainActivity.startActivityForResult(Intent,
558 | Copy_File_FromInternal_ToExternal);
559 | end;
560 | begin
561 | FileToBeCopied := TPath.Combine(TPath.GetDocumentsPath, 'delphican.pdf');
562 | CreateFilePdf(nil);
563 | end;
564 |
565 | procedure TForm1.CopyFile_FromInternalToExternal(File: string);
566 | const
567 | bufferSize = 4096 * 2;
568 | var
569 | noOfBytes: Integer;
570 | b: TJavaArray;
571 | File_Read: JInputStream;
572 | File_Write: JFileOutputStream;
573 | pfd: JParcelFileDescriptor;
574 | begin
575 | if not FileExists(File) then
576 | begin
577 | ShowMessage(File + ' not found!');
578 | exit;
579 | end;
580 | try
581 | DosyaOku := TAndroidHelper.Context.getContentResolver.openInputStream
582 | (TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init
583 | (StringToJString(File))));
584 | pfd := TAndroidHelper.Activity.getContentResolver.openFileDescriptor(UriCan,
585 | StringToJString('w'));
586 | DosyaYaz := TJFileOutputStream.JavaClass.init(pfd.getFileDescriptor);
587 | b := TJavaArray.Create(bufferSize);
588 | noOfBytes := File_Read.read(b);
589 | while (noOfBytes > 0) do
590 | begin
591 | File_Write.write(b, 0, noOfBytes);
592 | noOfBytes := File_Read.read(b);
593 | end;
594 | File_Write.close;
595 | File_Read.close;
596 | except
597 | on E: Exception do
598 | Application.ShowException(E);
599 | end;
600 | Showmessage('File copied from Internal to External : ' + DosyaAdi(UriCan));
601 | end;
602 | ```
603 |
604 |
605 | ### Copy File External -> Internal
606 |
607 | ```delphi
608 | procedure TForm1.ButtonFileCopyFromExternalToInternalClick(Sender: TObject);
609 | (* TFile.Copy(TPath.Combine(TPath.GetSharedDownloadsPath, 'delphican.pdf'),
610 | TPath.Combine(TPath.GetPublicPath, 'delphican.pdf')); *)
611 | var
612 | Intent: JIntent;
613 | begin
614 | Intent := TJIntent.Create;
615 | Intent.setAction(TJIntent.JavaClass.ACTION_OPEN_DOCUMENT);
616 | Intent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
617 | Intent.setType(StringToJString('*/*'));
618 | TAndroidHelper.Activity.startActivityForResult(Intent,
619 | Copy_File_FromExternal_ToInternal);
620 | end;
621 |
622 | procedure TForm1.FileCopy_FromExternalToInternal;
623 | const
624 | bufferSize = 4096 * 2;
625 | var
626 | noOfBytes: Integer;
627 | b: TJavaArray;
628 | File_Read: JInputStream;
629 | File_Write: JFileOutputStream;
630 | File: string;
631 | // pfd : JParcelFileDescriptor;
632 | begin
633 | try
634 | Dosya := TPath.Combine(TPath.GetPublicPath, DosyaAdi(UriCan));
635 | if FileExists(File) then
636 | begin
637 | ShowMessage('"' + File + '" zaten mevcut!');
638 | exit;
639 | end;
640 | File_Write := TJFileOutputStream.JavaClass.init(StringToJString(File));
641 | File_Read := TAndroidHelper.Context.getContentResolver.
642 | openInputStream(UriCan);
643 | b := TJavaArray.Create(bufferSize);
644 | noOfBytes := File_Read.read(b);
645 | while (noOfBytes > 0) do
646 | begin
647 | File_Write.write(b, 0, noOfBytes);
648 | noOfBytes := File_Read.read(b);
649 | end;
650 | File_Write.close;
651 | File_Read.close;
652 | except
653 | on E: Exception do
654 | Application.ShowException(E);
655 | end;
656 | ShowMessage('File copied from External to Internal : ' + File_Name(UriCan));
657 | end;
658 | ```
659 |
--------------------------------------------------------------------------------
/Unit1.fmx:
--------------------------------------------------------------------------------
1 | object Form1: TForm1
2 | Left = 0
3 | Top = 0
4 | ActiveControl = tiUriAl
5 | Caption = 'Form1'
6 | ClientHeight = 637
7 | ClientWidth = 498
8 | FormFactor.Width = 320
9 | FormFactor.Height = 480
10 | FormFactor.Devices = [Desktop]
11 | DesignerMasterStyle = 3
12 | object TabControl1: TTabControl
13 | Align = Client
14 | Size.Width = 498.000000000000000000
15 | Size.Height = 637.000000000000000000
16 | Size.PlatformDefault = False
17 | TabHeight = 49.000000000000000000
18 | TabIndex = 0
19 | TabOrder = 1
20 | TabPosition = PlatformDefault
21 | OnChange = TabControl1Change
22 | Sizes = (
23 | 498s
24 | 588s
25 | 498s
26 | 588s
27 | 498s
28 | 588s
29 | 498s
30 | 588s
31 | 498s
32 | 588s)
33 | object tiUriAl: TTabItem
34 | CustomIcon = <
35 | item
36 | end>
37 | IsSelected = True
38 | Size.Width = 99.000000000000000000
39 | Size.Height = 49.000000000000000000
40 | Size.PlatformDefault = False
41 | StyleLookup = ''
42 | TabOrder = 0
43 | Text = 'URI al'
44 | ExplicitSize.cx = 8.000000000000000000
45 | ExplicitSize.cy = 8.000000000000000000
46 | object ButtonBirDizininErisimineIzinVerin: TButton
47 | Align = Top
48 | Position.Y = 66.000000000000000000
49 | Size.Width = 498.000000000000000000
50 | Size.Height = 33.000000000000000000
51 | Size.PlatformDefault = False
52 | TabOrder = 0
53 | Text = 'Bir dizinin i'#231'eri'#287'ine eri'#351'im izni verin'
54 | OnClick = ButtonBirDizininErisimineIzinVerinClick
55 | end
56 | object ButtonBirDosyaAcin: TButton
57 | Align = Top
58 | Position.Y = 33.000000000000000000
59 | Size.Width = 498.000000000000000000
60 | Size.Height = 33.000000000000000000
61 | Size.PlatformDefault = False
62 | TabOrder = 1
63 | Text = 'Bir dosya a'#231#305'n'
64 | OnClick = ButtonBirDosyaAcinClick
65 | end
66 | object ButtonYeniBirDosyaOluşturun: TButton
67 | Align = Top
68 | Size.Width = 498.000000000000000000
69 | Size.Height = 33.000000000000000000
70 | Size.PlatformDefault = False
71 | TabOrder = 2
72 | Text = 'Yeni bir dosya olu'#351'turun'
73 | OnClick = ButtonYeniBirDosyaOluşturunClick
74 | end
75 | object Panel1: TPanel
76 | Align = Client
77 | Size.Width = 498.000000000000000000
78 | Size.Height = 456.000000000000000000
79 | Size.PlatformDefault = False
80 | TabOrder = 3
81 | object Memo1: TMemo
82 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
83 | DataDetectorTypes = []
84 | ReadOnly = True
85 | TextSettings.WordWrap = True
86 | Align = Client
87 | Size.Width = 498.000000000000000000
88 | Size.Height = 419.000000000000000000
89 | Size.PlatformDefault = False
90 | TabOrder = 0
91 | Viewport.Width = 490.000000000000000000
92 | Viewport.Height = 411.000000000000000000
93 | end
94 | object MemoUri: TMemo
95 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
96 | OnTap = MemoUriTap
97 | DataDetectorTypes = []
98 | ReadOnly = True
99 | StyledSettings = [Family, Style, FontColor]
100 | TextSettings.Font.Size = 11.000000000000000000
101 | TextSettings.WordWrap = True
102 | Align = Bottom
103 | Position.Y = 419.000000000000000000
104 | Size.Width = 498.000000000000000000
105 | Size.Height = 37.000000000000000000
106 | Size.PlatformDefault = False
107 | TabOrder = 3
108 | Viewport.Width = 490.000000000000000000
109 | Viewport.Height = 29.000000000000000000
110 | end
111 | end
112 | object ButtonHerhangiBirDosyaUrisiAl: TButton
113 | Align = Top
114 | Position.Y = 99.000000000000000000
115 | Size.Width = 498.000000000000000000
116 | Size.Height = 33.000000000000000000
117 | Size.PlatformDefault = False
118 | TabOrder = 4
119 | Text = 'Herhangi bir dosya Uri'#39'si al'
120 | OnClick = ButtonHerhangiBirDosyaUrisiAlClick
121 | end
122 | end
123 | object tiSAF1: TTabItem
124 | CustomIcon = <
125 | item
126 | end>
127 | IsSelected = False
128 | Size.Width = 99.000000000000000000
129 | Size.Height = 49.000000000000000000
130 | Size.PlatformDefault = False
131 | StyleLookup = ''
132 | TabOrder = 0
133 | Text = 'SAF 1'
134 | ExplicitSize.cx = 8.000000000000000000
135 | ExplicitSize.cy = 8.000000000000000000
136 | object ButtonBelgeAcinGirisAkisi: TButton
137 | Align = Top
138 | Position.Y = 99.000000000000000000
139 | Size.Width = 498.000000000000000000
140 | Size.Height = 33.000000000000000000
141 | Size.PlatformDefault = False
142 | TabOrder = 2
143 | Text = 'Belge a'#231#305'n - giri'#351' ak'#305#351#305
144 | OnClick = ButtonBelgeAcinGirisAkisiClick
145 | end
146 | object ButtonKaliciIzinler: TButton
147 | Align = Top
148 | Size.Width = 498.000000000000000000
149 | Size.Height = 33.000000000000000000
150 | Size.PlatformDefault = False
151 | TabOrder = 3
152 | Text = 'Kal'#305'c'#305' izinler'
153 | OnClick = ButtonKaliciIzinlerClick
154 | end
155 | object ButtonBelgeMetaVerileriniInceleyin: TButton
156 | Align = Top
157 | Position.Y = 33.000000000000000000
158 | Size.Width = 498.000000000000000000
159 | Size.Height = 33.000000000000000000
160 | Size.PlatformDefault = False
161 | TabOrder = 0
162 | Text = 'Belge meta verilerini inceleyin'
163 | OnClick = ButtonBelgeMetaVerileriniInceleyinClick
164 | end
165 | object ButtonBelgeAcinBitEslem: TButton
166 | Align = Top
167 | Position.Y = 66.000000000000000000
168 | Size.Width = 498.000000000000000000
169 | Size.Height = 33.000000000000000000
170 | Size.PlatformDefault = False
171 | TabOrder = 1
172 | Text = 'Belge a'#231#305'n - bit e'#351'lem'
173 | OnClick = ButtonBelgeAcinBitEslemClick
174 | end
175 | end
176 | object tiSAF2: TTabItem
177 | CustomIcon = <
178 | item
179 | end>
180 | IsSelected = False
181 | Size.Width = 99.000000000000000000
182 | Size.Height = 49.000000000000000000
183 | Size.PlatformDefault = False
184 | StyleLookup = ''
185 | TabOrder = 0
186 | Text = 'SAF 2'
187 | ExplicitSize.cx = 99.000000000000000000
188 | ExplicitSize.cy = 49.000000000000000000
189 | object ButtonSanalBirDosyaAcin: TButton
190 | Align = Top
191 | Position.Y = 66.000000000000000000
192 | Size.Width = 498.000000000000000000
193 | Size.Height = 33.000000000000000000
194 | Size.PlatformDefault = False
195 | TabOrder = 3
196 | Text = 'Sanal bir dosya a'#231#305'n'
197 | OnClick = ButtonSanalBirDosyaAcinClick
198 | end
199 | object ButtonSanalDosyadanGirisAkisi: TButton
200 | Align = Top
201 | Position.Y = 99.000000000000000000
202 | Size.Width = 498.000000000000000000
203 | Size.Height = 33.000000000000000000
204 | Size.PlatformDefault = False
205 | TabOrder = 4
206 | Text = 'Sanal dosyadan giri'#351' ak'#305#351#305
207 | OnClick = ButtonSanalDosyadanGirisAkisiClick
208 | end
209 | object ButtonBelgeDuzenleyin: TButton
210 | Align = Top
211 | Size.Width = 498.000000000000000000
212 | Size.Height = 33.000000000000000000
213 | Size.PlatformDefault = False
214 | TabOrder = 1
215 | Text = 'Belge d'#252'zenleyin'
216 | OnClick = ButtonBelgeDuzenleyinClick
217 | end
218 | object ButtonBelgeSilin: TButton
219 | Align = Top
220 | Position.Y = 33.000000000000000000
221 | Size.Width = 498.000000000000000000
222 | Size.Height = 33.000000000000000000
223 | Size.PlatformDefault = False
224 | TabOrder = 2
225 | Text = 'Belge Silin'
226 | OnClick = ButtonBelgeSilinClick
227 | end
228 | end
229 | object tiIlave1: TTabItem
230 | CustomIcon = <
231 | item
232 | end>
233 | IsSelected = False
234 | Size.Width = 99.000000000000000000
235 | Size.Height = 49.000000000000000000
236 | Size.PlatformDefault = False
237 | StyleLookup = ''
238 | TabOrder = 0
239 | Text = 'ilave 1'
240 | ExplicitSize.cx = 166.000000000000000000
241 | ExplicitSize.cy = 49.000000000000000000
242 | object ButtonMetinDosyasiOku: TButton
243 | Align = Top
244 | Size.Width = 498.000000000000000000
245 | Size.Height = 33.000000000000000000
246 | Size.PlatformDefault = False
247 | TabOrder = 1
248 | Text = 'Metin dosyas'#305' oku'
249 | OnClick = ButtonMetinDosyasiOkuClick
250 | end
251 | object ButtonPdfGoster: TButton
252 | Align = Top
253 | Position.Y = 66.000000000000000000
254 | Size.Width = 498.000000000000000000
255 | Size.Height = 33.000000000000000000
256 | Size.PlatformDefault = False
257 | TabOrder = 0
258 | Text = 'Pdf g'#246'ster'
259 | OnClick = ButtonPdfGosterClick
260 | end
261 | object xButtonPdfSec: TButton
262 | Align = Top
263 | Position.Y = 33.000000000000000000
264 | Size.Width = 498.000000000000000000
265 | Size.Height = 33.000000000000000000
266 | Size.PlatformDefault = False
267 | TabOrder = 8
268 | Text = 'Pdf se'#231
269 | OnClick = xButtonPdfSecClick
270 | end
271 | object ImageControl1: TImageControl
272 | Align = Right
273 | Position.X = 392.000000000000000000
274 | Position.Y = 132.000000000000000000
275 | Size.Width = 106.000000000000000000
276 | Size.Height = 456.000000000000000000
277 | Size.PlatformDefault = False
278 | TabOrder = 9
279 | end
280 | object ButtonResimGoster: TButton
281 | Align = Top
282 | Position.Y = 99.000000000000000000
283 | Size.Width = 498.000000000000000000
284 | Size.Height = 33.000000000000000000
285 | Size.PlatformDefault = False
286 | TabOrder = 10
287 | Text = 'Resim g'#246'ster'
288 | OnClick = ButtonResimGosterClick
289 | end
290 | end
291 | object tiIlave2: TTabItem
292 | CustomIcon = <
293 | item
294 | end>
295 | IsSelected = False
296 | Size.Width = 102.000000000000000000
297 | Size.Height = 49.000000000000000000
298 | Size.PlatformDefault = False
299 | StyleLookup = ''
300 | TabOrder = 0
301 | Text = 'ilave 2'
302 | ExplicitSize.cx = 126.000000000000000000
303 | ExplicitSize.cy = 49.000000000000000000
304 | object ButtonDosyaKopyalayinDahilidenHariciye: TButton
305 | Align = Top
306 | Size.Width = 498.000000000000000000
307 | Size.Height = 33.000000000000000000
308 | Size.PlatformDefault = False
309 | TabOrder = 3
310 | Text = 'Dosya kopyalay'#305'n Dahili -> Harici'
311 | OnClick = ButtonDosyaKopyalayinDahilidenHariciyeClick
312 | end
313 | object ButtonDosyaKopyalayinHaricidenDahiliye: TButton
314 | Align = Top
315 | Position.Y = 33.000000000000000000
316 | Size.Width = 498.000000000000000000
317 | Size.Height = 33.000000000000000000
318 | Size.PlatformDefault = False
319 | TabOrder = 2
320 | Text = 'Dosya kopyalay'#305'n Harici -> Dahili'
321 | OnClick = ButtonDosyaKopyalayinHaricidenDahiliyeClick
322 | end
323 | object ButtonDosyaPaylasin: TButton
324 | Align = Top
325 | Position.Y = 66.000000000000000000
326 | Size.Width = 498.000000000000000000
327 | Size.Height = 33.000000000000000000
328 | Size.PlatformDefault = False
329 | TabOrder = 1
330 | Text = 'Dosya payla'#351#305'n'
331 | OnClick = ButtonDosyaPaylasinClick
332 | end
333 | object ButtonDosyalarCetveli: TButton
334 | Align = Top
335 | Position.Y = 99.000000000000000000
336 | Size.Width = 498.000000000000000000
337 | Size.Height = 33.000000000000000000
338 | Size.PlatformDefault = False
339 | TabOrder = 5
340 | Text = 'Dosyalar cetveli'
341 | OnClick = ButtonDosyalarCetveliClick
342 | end
343 | end
344 | end
345 | end
346 |
--------------------------------------------------------------------------------
/Unit1.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/emozgun/delphi-android-SAF/b056d5f82033ffaa5bac9898fc3ebe1b274af0ec/Unit1.pas
--------------------------------------------------------------------------------
/addp_SAF.deployproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 12
5 |
6 |
7 | 2a9d17d9873f7ece
8 | 2a9d17d9873f7ece
9 |
10 | iPhone5
11 |
12 |
13 |
14 |
15 |
16 | addp_SAF\
17 | addp_SAF.exe
18 | ProjectOutput
19 | 0
20 |
21 |
22 | True
23 | True
24 |
25 |
26 |
27 |
28 |
29 |
30 | addp_SAF\
31 | AndroidManifest.xml
32 | ProjectAndroidManifest
33 | 1
34 |
35 |
36 | True
37 |
38 |
39 | addp_SAF\res\drawable\
40 | splash_image_def.xml
41 | AndroidSplashImageDef
42 | 1
43 |
44 |
45 | True
46 |
47 |
48 | addp_SAF\res\drawable-mdpi\
49 | ic_notification.png
50 | Android_NotificationIcon24
51 | 1
52 |
53 |
54 | True
55 |
56 |
57 | addp_SAF\res\values-v21\
58 | styles.xml
59 | AndroidSplashStylesV21
60 | 1
61 |
62 |
63 | True
64 |
65 |
66 | addp_SAF\library\lib\mips\
67 | libSAFAndroidDosyaDepolamaPaylasma2.so
68 | AndroidLibnativeMipsFile
69 | 1
70 |
71 |
72 | True
73 |
74 |
75 | addp_SAF\res\drawable-normal\
76 | splash_image.png
77 | Android_SplashImage470
78 | 1
79 |
80 |
81 | True
82 |
83 |
84 | addp_SAF\res\drawable-xxhdpi\
85 | ic_notification.png
86 | Android_NotificationIcon72
87 | 1
88 |
89 |
90 | True
91 |
92 |
93 | addp_SAF\res\drawable-xxxhdpi\
94 | ic_notification.png
95 | Android_NotificationIcon96
96 | 1
97 |
98 |
99 | True
100 |
101 |
102 | addp_SAF\res\drawable-xhdpi\
103 | ic_notification.png
104 | Android_NotificationIcon48
105 | 1
106 |
107 |
108 | True
109 |
110 |
111 | addp_SAF\classes\
112 | classes.dex
113 | AndroidClassesDexFile
114 | 1
115 |
116 |
117 | True
118 |
119 |
120 | addp_SAF\res\drawable-mdpi\
121 | ic_launcher.png
122 | Android_LauncherIcon48
123 | 1
124 |
125 |
126 | True
127 |
128 |
129 | addp_SAF\res\values\
130 | styles.xml
131 | AndroidSplashStyles
132 | 1
133 |
134 |
135 | True
136 |
137 |
138 | addp_SAF\res\drawable-ldpi\
139 | ic_launcher.png
140 | Android_LauncherIcon36
141 | 1
142 |
143 |
144 | True
145 |
146 |
147 | addp_SAF\res\drawable-small\
148 | splash_image.png
149 | Android_SplashImage426
150 | 1
151 |
152 |
153 | True
154 |
155 |
156 | addp_SAF\res\drawable-xlarge\
157 | splash_image.png
158 | Android_SplashImage960
159 | 1
160 |
161 |
162 | True
163 |
164 |
165 | addp_SAF\library\lib\armeabi-v7a\
166 | libaddp_SAF.so
167 | ProjectOutput
168 | 1
169 |
170 |
171 | True
172 | True
173 |
174 |
175 | addp_SAF\library\lib\armeabi\
176 | libSAFAndroidDosyaDepolamaPaylasma2.so
177 | AndroidLibnativeArmeabiFile
178 | 1
179 |
180 |
181 | True
182 |
183 |
184 | addp_SAF\res\drawable-hdpi\
185 | ic_launcher.png
186 | Android_LauncherIcon72
187 | 1
188 |
189 |
190 | True
191 |
192 |
193 | addp_SAF\res\drawable-hdpi\
194 | ic_notification.png
195 | Android_NotificationIcon36
196 | 1
197 |
198 |
199 | True
200 |
201 |
202 | addp_SAF\res\drawable-xxhdpi\
203 | ic_launcher.png
204 | Android_LauncherIcon144
205 | 1
206 |
207 |
208 | True
209 |
210 |
211 | addp_SAF\res\drawable-xhdpi\
212 | ic_launcher.png
213 | Android_LauncherIcon96
214 | 1
215 |
216 |
217 | True
218 |
219 |
220 | addp_SAF\res\values\
221 | strings.xml
222 | Android_Strings
223 | 1
224 |
225 |
226 | True
227 |
228 |
229 | addp_SAF\assets\internal\
230 | delphican.pdf
231 | ProjectFile
232 | 0
233 |
234 |
235 | True
236 |
237 |
238 | addp_SAF\res\drawable-large\
239 | splash_image.png
240 | Android_SplashImage640
241 | 1
242 |
243 |
244 | True
245 |
246 |
247 | addp_SAF\res\values\
248 | colors.xml
249 | Android_Colors
250 | 1
251 |
252 |
253 | True
254 |
255 |
256 | addp_SAF\res\drawable-xxxhdpi\
257 | ic_launcher.png
258 | Android_LauncherIcon192
259 | 1
260 |
261 |
262 | True
263 |
264 |
265 |
266 |
267 | addp_SAF.app\
268 | libcgunwind.1.0.dylib
269 | DependencyModule
270 | 1
271 |
272 |
273 | True
274 |
275 |
276 | addp_SAF.app\
277 | libpcre.dylib
278 | DependencyModule
279 | 1
280 |
281 |
282 | True
283 |
284 |
285 |
286 |
287 | addp_SAF\res\drawable-xhdpi\
288 | ic_notification.png
289 | Android_NotificationIcon48
290 | 1
291 |
292 |
293 | True
294 |
295 |
296 | addp_SAF\res\drawable-xxxhdpi\
297 | ic_notification.png
298 | Android_NotificationIcon96
299 | 1
300 |
301 |
302 | True
303 |
304 |
305 | addp_SAF\res\drawable-hdpi\
306 | ic_launcher.png
307 | Android_LauncherIcon72
308 | 1
309 |
310 |
311 | True
312 |
313 |
314 | addp_SAF\library\lib\arm64-v8a\
315 | libaddp_SAF.so
316 | ProjectOutput
317 | 1
318 |
319 |
320 | True
321 | True
322 |
323 |
324 | addp_SAF\res\drawable-xxhdpi\
325 | ic_notification.png
326 | Android_NotificationIcon72
327 | 1
328 |
329 |
330 | True
331 |
332 |
333 | addp_SAF\res\drawable-xlarge\
334 | splash_image.png
335 | Android_SplashImage960
336 | 1
337 |
338 |
339 | True
340 |
341 |
342 | addp_SAF\library\lib\armeabi\
343 | libSAFAndroidDosyaDepolamaPaylasma2.so
344 | AndroidLibnativeArmeabiFile
345 | 1
346 |
347 |
348 | True
349 |
350 |
351 | addp_SAF\res\drawable-ldpi\
352 | ic_launcher.png
353 | Android_LauncherIcon36
354 | 1
355 |
356 |
357 | True
358 |
359 |
360 | addp_SAF\res\drawable-xxhdpi\
361 | ic_launcher.png
362 | Android_LauncherIcon144
363 | 1
364 |
365 |
366 | True
367 |
368 |
369 | addp_SAF\library\lib\arm64-v8a\
370 | libaddp_SAF.so
371 | ProjectOutput
372 | 1
373 |
374 |
375 | True
376 | True
377 |
378 |
379 | addp_SAF\res\drawable-hdpi\
380 | ic_notification.png
381 | Android_NotificationIcon36
382 | 1
383 |
384 |
385 | True
386 |
387 |
388 | addp_SAF\res\values\
389 | styles.xml
390 | AndroidSplashStyles
391 | 1
392 |
393 |
394 | True
395 |
396 |
397 | addp_SAF\res\drawable-mdpi\
398 | ic_notification.png
399 | Android_NotificationIcon24
400 | 1
401 |
402 |
403 | True
404 |
405 |
406 | addp_SAF\res\drawable-hdpi\
407 | ic_notification.png
408 | Android_NotificationIcon36
409 | 1
410 |
411 |
412 | True
413 |
414 |
415 | addp_SAF\classes\
416 | classes.dex
417 | AndroidClassesDexFile
418 | 1
419 |
420 |
421 | True
422 |
423 |
424 | addp_SAF\res\drawable-xhdpi\
425 | ic_notification.png
426 | Android_NotificationIcon48
427 | 1
428 |
429 |
430 | True
431 |
432 |
433 | addp_SAF\library\lib\armeabi\
434 | libAndroidDosyaDepolamaPaylasma2SAF.so
435 | AndroidLibnativeArmeabiFile
436 | 1
437 |
438 |
439 | True
440 |
441 |
442 | addp_SAF\res\values\
443 | styles.xml
444 | AndroidSplashStyles
445 | 1
446 |
447 |
448 | True
449 |
450 |
451 | addp_SAF\res\drawable-mdpi\
452 | ic_notification.png
453 | Android_NotificationIcon24
454 | 1
455 |
456 |
457 | True
458 |
459 |
460 | addp_SAF\res\values\
461 | strings.xml
462 | Android_Strings
463 | 1
464 |
465 |
466 | True
467 |
468 |
469 | addp_SAF\res\drawable-xxxhdpi\
470 | ic_launcher.png
471 | Android_LauncherIcon192
472 | 1
473 |
474 |
475 | True
476 |
477 |
478 | addp_SAF\res\drawable-xhdpi\
479 | ic_launcher.png
480 | Android_LauncherIcon96
481 | 1
482 |
483 |
484 | True
485 |
486 |
487 | addp_SAF\res\xml\
488 | provider_paths.xml
489 | AndroidFileProvider
490 | 1
491 |
492 |
493 | True
494 |
495 |
496 | addp_SAF\res\drawable-xlarge\
497 | splash_image.png
498 | Android_SplashImage960
499 | 1
500 |
501 |
502 | True
503 |
504 |
505 | addp_SAF\res\drawable-xhdpi\
506 | ic_launcher.png
507 | Android_LauncherIcon96
508 | 1
509 |
510 |
511 | True
512 |
513 |
514 | addp_SAF\res\drawable-hdpi\
515 | ic_launcher.png
516 | Android_LauncherIcon72
517 | 1
518 |
519 |
520 | True
521 |
522 |
523 | addp_SAF\res\drawable-large\
524 | splash_image.png
525 | Android_SplashImage640
526 | 1
527 |
528 |
529 | True
530 |
531 |
532 | addp_SAF\res\drawable-xxhdpi\
533 | ic_notification.png
534 | Android_NotificationIcon72
535 | 1
536 |
537 |
538 | True
539 |
540 |
541 | addp_SAF\library\lib\armeabi-v7a\
542 | libSAFAndroidDosyaDepolamaPaylasma2.so
543 | AndroidLibnativeArmeabiv7aFile
544 | 1
545 |
546 |
547 | True
548 |
549 |
550 | addp_SAF\res\values\
551 | colors.xml
552 | Android_Colors
553 | 1
554 |
555 |
556 | True
557 |
558 |
559 | addp_SAF\res\drawable-xxhdpi\
560 | ic_launcher.png
561 | Android_LauncherIcon144
562 | 1
563 |
564 |
565 | True
566 |
567 |
568 | addp_SAF\res\drawable-normal\
569 | splash_image.png
570 | Android_SplashImage470
571 | 1
572 |
573 |
574 | True
575 |
576 |
577 | addp_SAF\library\lib\mips\
578 | libSAFAndroidDosyaDepolamaPaylasma2.so
579 | AndroidLibnativeMipsFile
580 | 1
581 |
582 |
583 | True
584 |
585 |
586 | addp_SAF\res\drawable-large\
587 | splash_image.png
588 | Android_SplashImage640
589 | 1
590 |
591 |
592 | True
593 |
594 |
595 | addp_SAF\assets\internal\
596 | delphican.pdf
597 | ProjectFile
598 | 0
599 |
600 |
601 | True
602 |
603 |
604 | addp_SAF\classes\
605 | classes.dex
606 | AndroidClassesDexFile
607 | 1
608 |
609 |
610 | True
611 |
612 |
613 | addp_SAF\
614 | AndroidManifest.xml
615 | ProjectAndroidManifest
616 | 1
617 |
618 |
619 | True
620 |
621 |
622 | addp_SAF\res\values\
623 | colors.xml
624 | Android_Colors
625 | 1
626 |
627 |
628 | True
629 |
630 |
631 | addp_SAF\
632 | AndroidManifest.xml
633 | ProjectAndroidManifest
634 | 1
635 |
636 |
637 | True
638 |
639 |
640 | addp_SAF\res\values-v21\
641 | styles.xml
642 | AndroidSplashStylesV21
643 | 1
644 |
645 |
646 | True
647 |
648 |
649 | addp_SAF\res\drawable\
650 | splash_image_def.xml
651 | AndroidSplashImageDef
652 | 1
653 |
654 |
655 | True
656 |
657 |
658 | addp_SAF\res\drawable-mdpi\
659 | ic_launcher.png
660 | Android_LauncherIcon48
661 | 1
662 |
663 |
664 | True
665 |
666 |
667 | addp_SAF\res\drawable-xxxhdpi\
668 | ic_notification.png
669 | Android_NotificationIcon96
670 | 1
671 |
672 |
673 | True
674 |
675 |
676 | addp_SAF\res\drawable-mdpi\
677 | ic_launcher.png
678 | Android_LauncherIcon48
679 | 1
680 |
681 |
682 | True
683 |
684 |
685 | addp_SAF\res\drawable-xxxhdpi\
686 | ic_launcher.png
687 | Android_LauncherIcon192
688 | 1
689 |
690 |
691 | True
692 |
693 |
694 | addp_SAF\res\drawable\
695 | splash_image_def.xml
696 | AndroidSplashImageDef
697 | 1
698 |
699 |
700 | True
701 |
702 |
703 | addp_SAF\res\drawable-small\
704 | splash_image.png
705 | Android_SplashImage426
706 | 1
707 |
708 |
709 | True
710 |
711 |
712 | addp_SAF\res\drawable-normal\
713 | splash_image.png
714 | Android_SplashImage470
715 | 1
716 |
717 |
718 | True
719 |
720 |
721 | addp_SAF\library\lib\mips\
722 | libAndroidDosyaDepolamaPaylasma2SAF.so
723 | AndroidLibnativeMipsFile
724 | 1
725 |
726 |
727 | True
728 |
729 |
730 | addp_SAF\res\values-v21\
731 | styles.xml
732 | AndroidSplashStylesV21
733 | 1
734 |
735 |
736 | True
737 |
738 |
739 | addp_SAF\res\drawable-ldpi\
740 | ic_launcher.png
741 | Android_LauncherIcon36
742 | 1
743 |
744 |
745 | True
746 |
747 |
748 | addp_SAF\res\values\
749 | strings.xml
750 | Android_Strings
751 | 1
752 |
753 |
754 | True
755 |
756 |
757 | addp_SAF\library\lib\armeabi-v7a\
758 | libAndroidDosyaDepolamaPaylasma2SAF.so
759 | AndroidLibnativeArmeabiv7aFile
760 | 1
761 |
762 |
763 | True
764 |
765 |
766 | addp_SAF\res\drawable-small\
767 | splash_image.png
768 | Android_SplashImage426
769 | 1
770 |
771 |
772 | True
773 |
774 |
775 |
776 |
--------------------------------------------------------------------------------
/addp_SAF.dpr:
--------------------------------------------------------------------------------
1 | program addp_SAF;
2 |
3 | uses
4 | System.StartUpCopy,
5 | FMX.Forms,
6 | Unit1 in 'Unit1.pas' {Form1};
7 |
8 | {$R *.res}
9 |
10 | begin
11 | Application.Initialize;
12 | Application.CreateForm(TForm1, Form1);
13 | Application.Run;
14 | end.
15 |
--------------------------------------------------------------------------------
/addp_SAF.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {848BE8BD-42FA-49F4-9161-2118A95A4C02}
4 | 19.2
5 | FMX
6 | True
7 | Release
8 | Android64
9 | 37915
10 | Application
11 | addp_SAF.dpr
12 |
13 |
14 | true
15 |
16 |
17 | true
18 | Base
19 | true
20 |
21 |
22 | true
23 | Base
24 | true
25 |
26 |
27 | true
28 | Base
29 | true
30 |
31 |
32 | true
33 | Base
34 | true
35 |
36 |
37 | true
38 | Base
39 | true
40 |
41 |
42 | true
43 | Base
44 | true
45 |
46 |
47 | true
48 | Base
49 | true
50 |
51 |
52 | true
53 | Base
54 | true
55 |
56 |
57 | true
58 | Cfg_1
59 | true
60 | true
61 |
62 |
63 | true
64 | Cfg_1
65 | true
66 | true
67 |
68 |
69 | true
70 | Cfg_1
71 | true
72 | true
73 |
74 |
75 | true
76 | Base
77 | true
78 |
79 |
80 | true
81 | Cfg_2
82 | true
83 | true
84 |
85 |
86 | true
87 | Cfg_2
88 | true
89 | true
90 |
91 |
92 | true
93 | Cfg_2
94 | true
95 | true
96 |
97 |
98 | true
99 | Cfg_2
100 | true
101 | true
102 |
103 |
104 | .\$(Platform)\$(Config)
105 | .\$(Platform)\$(Config)
106 | false
107 | false
108 | false
109 | false
110 | false
111 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
112 | true
113 | true
114 | true
115 | true
116 | true
117 | true
118 | true
119 | true
120 | $(BDS)\bin\delphi_PROJECTICON.ico
121 | $(BDS)\bin\delphi_PROJECTICNS.icns
122 | addp_SAF
123 |
124 |
125 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
126 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
127 | Debug
128 | true
129 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
130 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
131 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
132 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
133 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
134 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
135 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
136 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
137 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
138 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
139 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
140 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
141 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
142 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
143 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
144 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
145 | false
146 | false
147 | false
148 | false
149 | false
150 | false
151 | false
152 | false
153 | 1
154 | #000000
155 |
156 |
157 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
158 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
159 | Debug
160 | true
161 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
162 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
163 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
164 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
165 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
166 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
167 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
168 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
169 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
170 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
171 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
172 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
173 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
174 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
175 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
176 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
177 | 1
178 | #000000
179 | false
180 | false
181 | false
182 | false
183 | false
184 | false
185 | false
186 | false
187 | true
188 |
189 |
190 | DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
191 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers
192 | iPhoneAndiPad
193 | true
194 | Debug
195 | $(MSBuildProjectName)
196 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png
197 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png
198 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png
199 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png
200 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png
201 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png
202 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png
203 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png
204 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png
205 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png
206 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png
207 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png
208 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png
209 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png
210 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png
211 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png
212 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png
213 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png
214 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png
215 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png
216 |
217 |
218 | DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
219 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers
220 | iPhoneAndiPad
221 | true
222 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png
223 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png
224 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png
225 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png
226 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png
227 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png
228 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png
229 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png
230 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png
231 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png
232 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png
233 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png
234 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png
235 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png
236 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png
237 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png
238 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png
239 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png
240 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png
241 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png
242 | 10.0
243 |
244 |
245 | DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage)
246 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers
247 | Debug
248 | true
249 |
250 |
251 | DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;kayanyazi;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage)
252 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
253 | Debug
254 | true
255 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
256 | 1033
257 | $(BDS)\bin\default_app.manifest
258 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
259 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
260 |
261 |
262 | DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage)
263 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
264 | Debug
265 | true
266 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
267 | 1033
268 | $(BDS)\bin\default_app.manifest
269 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
270 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
271 |
272 |
273 | DEBUG;$(DCC_Define)
274 | true
275 | false
276 | true
277 | true
278 | true
279 |
280 |
281 | false
282 | false
283 | false
284 | false
285 | false
286 | false
287 | false
288 | false
289 | 1
290 | true
291 |
292 |
293 | false
294 | true
295 | PerMonitorV2
296 |
297 |
298 | true
299 | PerMonitorV2
300 |
301 |
302 | false
303 | RELEASE;$(DCC_Define)
304 | 0
305 | 0
306 |
307 |
308 | false
309 | false
310 | false
311 | false
312 | false
313 | false
314 | false
315 | false
316 | 1
317 | #000000
318 |
319 |
320 | true
321 | 1
322 | false
323 | false
324 | false
325 | false
326 | false
327 | false
328 | false
329 | false
330 |
331 |
332 | true
333 | PerMonitorV2
334 |
335 |
336 | true
337 | PerMonitorV2
338 |
339 |
340 |
341 | MainSource
342 |
343 |
344 |
345 | fmx
346 |
347 |
348 |
349 | Cfg_2
350 | Base
351 |
352 |
353 | Base
354 |
355 |
356 | Cfg_1
357 | Base
358 |
359 |
360 |
361 | Delphi.Personality.12
362 | Application
363 |
364 |
365 |
366 | addp_SAF.dpr
367 |
368 |
369 | Microsoft Office 2000 Sample Automation Server Wrapper Components
370 | Microsoft Office XP Sample Automation Server Wrapper Components
371 |
372 |
373 |
374 |
375 |
376 | true
377 |
378 |
379 |
380 |
381 | ic_notification.png
382 | true
383 |
384 |
385 |
386 |
387 | ic_notification.png
388 | true
389 |
390 |
391 |
392 |
393 | true
394 |
395 |
396 |
397 |
398 | ic_notification.png
399 | true
400 |
401 |
402 |
403 |
404 | ic_launcher.png
405 | true
406 |
407 |
408 |
409 |
410 | libaddp_SAF.so
411 | true
412 |
413 |
414 |
415 |
416 | ic_notification.png
417 | true
418 |
419 |
420 |
421 |
422 | splash_image.png
423 | true
424 |
425 |
426 |
427 |
428 | libSAFAndroidDosyaDepolamaPaylasma2.so
429 | true
430 |
431 |
432 |
433 |
434 | ic_launcher.png
435 | true
436 |
437 |
438 |
439 |
440 | ic_launcher.png
441 | true
442 |
443 |
444 |
445 |
446 | libaddp_SAF.so
447 | true
448 |
449 |
450 |
451 |
452 | ic_notification.png
453 | true
454 |
455 |
456 |
457 |
458 | true
459 |
460 |
461 |
462 |
463 | ic_notification.png
464 | true
465 |
466 |
467 |
468 |
469 | ic_notification.png
470 | true
471 |
472 |
473 |
474 |
475 | classes.dex
476 | true
477 |
478 |
479 |
480 |
481 | styles.xml
482 | true
483 |
484 |
485 |
486 |
487 | true
488 |
489 |
490 |
491 |
492 | ic_notification.png
493 | true
494 |
495 |
496 |
497 |
498 | libSAFAndroidDosyaDepolamaPaylasma2.so
499 | true
500 |
501 |
502 |
503 |
504 | splash_image.png
505 | true
506 |
507 |
508 |
509 |
510 | libAndroidDosyaDepolamaPaylasma2SAF.so
511 | true
512 |
513 |
514 |
515 |
516 | true
517 |
518 |
519 |
520 |
521 | ic_notification.png
522 | true
523 |
524 |
525 |
526 |
527 | true
528 |
529 |
530 |
531 |
532 | ic_notification.png
533 | true
534 |
535 |
536 |
537 |
538 | ic_notification.png
539 | true
540 |
541 |
542 |
543 |
544 | true
545 |
546 |
547 |
548 |
549 | ic_launcher.png
550 | true
551 |
552 |
553 |
554 |
555 | ic_launcher.png
556 | true
557 |
558 |
559 |
560 |
561 | ic_notification.png
562 | true
563 |
564 |
565 |
566 |
567 | addp_SAF.exe
568 | true
569 |
570 |
571 |
572 |
573 | classes.dex
574 | true
575 |
576 |
577 |
578 |
579 | provider_paths.xml
580 | true
581 |
582 |
583 |
584 |
585 | ic_launcher.png
586 | true
587 |
588 |
589 |
590 |
591 | splash_image.png
592 | true
593 |
594 |
595 |
596 |
597 | ic_launcher.png
598 | true
599 |
600 |
601 |
602 |
603 | ic_launcher.png
604 | true
605 |
606 |
607 |
608 |
609 | true
610 |
611 |
612 |
613 |
614 | ic_launcher.png
615 | true
616 |
617 |
618 |
619 |
620 | splash_image.png
621 | true
622 |
623 |
624 |
625 |
626 | splash_image.png
627 | true
628 |
629 |
630 |
631 |
632 | ic_notification.png
633 | true
634 |
635 |
636 |
637 |
638 | libSAFAndroidDosyaDepolamaPaylasma2.so
639 | true
640 |
641 |
642 |
643 |
644 | splash_image.png
645 | true
646 |
647 |
648 |
649 |
650 | true
651 |
652 |
653 |
654 |
655 | ic_launcher.png
656 | true
657 |
658 |
659 |
660 |
661 | libaddp_SAF.so
662 | true
663 |
664 |
665 |
666 |
667 | splash_image.png
668 | true
669 |
670 |
671 |
672 |
673 | libSAFAndroidDosyaDepolamaPaylasma2.so
674 | true
675 |
676 |
677 |
678 |
679 | ic_launcher.png
680 | true
681 |
682 |
683 |
684 |
685 | libSAFAndroidDosyaDepolamaPaylasma2.so
686 | true
687 |
688 |
689 |
690 |
691 | splash_image.png
692 | true
693 |
694 |
695 |
696 |
697 | .\assets\internal\
698 | true
699 |
700 |
701 |
702 |
703 | classes.dex
704 | true
705 |
706 |
707 |
708 |
709 | true
710 |
711 |
712 |
713 |
714 | ic_notification.png
715 | true
716 |
717 |
718 |
719 |
720 | true
721 |
722 |
723 |
724 |
725 | true
726 |
727 |
728 |
729 |
730 | styles.xml
731 | true
732 |
733 |
734 |
735 |
736 | ic_launcher.png
737 | true
738 |
739 |
740 |
741 |
742 | true
743 |
744 |
745 |
746 |
747 | ic_launcher.png
748 | true
749 |
750 |
751 |
752 |
753 | ic_notification.png
754 | true
755 |
756 |
757 |
758 |
759 | ic_launcher.png
760 | true
761 |
762 |
763 |
764 |
765 | ic_launcher.png
766 | true
767 |
768 |
769 |
770 |
771 | true
772 |
773 |
774 |
775 |
776 | ic_launcher.png
777 | true
778 |
779 |
780 |
781 |
782 | true
783 |
784 |
785 |
786 |
787 | true
788 |
789 |
790 |
791 |
792 | .\assets\internal\
793 | true
794 |
795 |
796 |
797 |
798 | splash_image.png
799 | true
800 |
801 |
802 |
803 |
804 | splash_image.png
805 | true
806 |
807 |
808 |
809 |
810 | true
811 |
812 |
813 |
814 |
815 | splash_image.png
816 | true
817 |
818 |
819 |
820 |
821 | libAndroidDosyaDepolamaPaylasma2SAF.so
822 | true
823 |
824 |
825 |
826 |
827 | styles.xml
828 | true
829 |
830 |
831 |
832 |
833 | ic_launcher.png
834 | true
835 |
836 |
837 |
838 |
839 | true
840 |
841 |
842 |
843 |
844 | ic_launcher.png
845 | true
846 |
847 |
848 |
849 |
850 | libAndroidDosyaDepolamaPaylasma2SAF.so
851 | true
852 |
853 |
854 |
855 |
856 | splash_image.png
857 | true
858 |
859 |
860 |
861 |
862 | 1
863 |
864 |
865 | Contents\MacOS
866 | 1
867 |
868 |
869 | 0
870 |
871 |
872 |
873 |
874 | classes
875 | 1
876 |
877 |
878 | classes
879 | 1
880 |
881 |
882 |
883 |
884 | res\xml
885 | 1
886 |
887 |
888 | res\xml
889 | 1
890 |
891 |
892 |
893 |
894 | library\lib\armeabi-v7a
895 | 1
896 |
897 |
898 |
899 |
900 | library\lib\armeabi
901 | 1
902 |
903 |
904 | library\lib\armeabi
905 | 1
906 |
907 |
908 |
909 |
910 | library\lib\armeabi-v7a
911 | 1
912 |
913 |
914 |
915 |
916 | library\lib\mips
917 | 1
918 |
919 |
920 | library\lib\mips
921 | 1
922 |
923 |
924 |
925 |
926 | library\lib\armeabi-v7a
927 | 1
928 |
929 |
930 | library\lib\arm64-v8a
931 | 1
932 |
933 |
934 |
935 |
936 | library\lib\armeabi-v7a
937 | 1
938 |
939 |
940 |
941 |
942 | res\drawable
943 | 1
944 |
945 |
946 | res\drawable
947 | 1
948 |
949 |
950 |
951 |
952 | res\values
953 | 1
954 |
955 |
956 | res\values
957 | 1
958 |
959 |
960 |
961 |
962 | res\values-v21
963 | 1
964 |
965 |
966 | res\values-v21
967 | 1
968 |
969 |
970 |
971 |
972 | res\values
973 | 1
974 |
975 |
976 | res\values
977 | 1
978 |
979 |
980 |
981 |
982 | res\drawable
983 | 1
984 |
985 |
986 | res\drawable
987 | 1
988 |
989 |
990 |
991 |
992 | res\drawable-xxhdpi
993 | 1
994 |
995 |
996 | res\drawable-xxhdpi
997 | 1
998 |
999 |
1000 |
1001 |
1002 | res\drawable-xxxhdpi
1003 | 1
1004 |
1005 |
1006 | res\drawable-xxxhdpi
1007 | 1
1008 |
1009 |
1010 |
1011 |
1012 | res\drawable-ldpi
1013 | 1
1014 |
1015 |
1016 | res\drawable-ldpi
1017 | 1
1018 |
1019 |
1020 |
1021 |
1022 | res\drawable-mdpi
1023 | 1
1024 |
1025 |
1026 | res\drawable-mdpi
1027 | 1
1028 |
1029 |
1030 |
1031 |
1032 | res\drawable-hdpi
1033 | 1
1034 |
1035 |
1036 | res\drawable-hdpi
1037 | 1
1038 |
1039 |
1040 |
1041 |
1042 | res\drawable-xhdpi
1043 | 1
1044 |
1045 |
1046 | res\drawable-xhdpi
1047 | 1
1048 |
1049 |
1050 |
1051 |
1052 | res\drawable-mdpi
1053 | 1
1054 |
1055 |
1056 | res\drawable-mdpi
1057 | 1
1058 |
1059 |
1060 |
1061 |
1062 | res\drawable-hdpi
1063 | 1
1064 |
1065 |
1066 | res\drawable-hdpi
1067 | 1
1068 |
1069 |
1070 |
1071 |
1072 | res\drawable-xhdpi
1073 | 1
1074 |
1075 |
1076 | res\drawable-xhdpi
1077 | 1
1078 |
1079 |
1080 |
1081 |
1082 | res\drawable-xxhdpi
1083 | 1
1084 |
1085 |
1086 | res\drawable-xxhdpi
1087 | 1
1088 |
1089 |
1090 |
1091 |
1092 | res\drawable-xxxhdpi
1093 | 1
1094 |
1095 |
1096 | res\drawable-xxxhdpi
1097 | 1
1098 |
1099 |
1100 |
1101 |
1102 | res\drawable-small
1103 | 1
1104 |
1105 |
1106 | res\drawable-small
1107 | 1
1108 |
1109 |
1110 |
1111 |
1112 | res\drawable-normal
1113 | 1
1114 |
1115 |
1116 | res\drawable-normal
1117 | 1
1118 |
1119 |
1120 |
1121 |
1122 | res\drawable-large
1123 | 1
1124 |
1125 |
1126 | res\drawable-large
1127 | 1
1128 |
1129 |
1130 |
1131 |
1132 | res\drawable-xlarge
1133 | 1
1134 |
1135 |
1136 | res\drawable-xlarge
1137 | 1
1138 |
1139 |
1140 |
1141 |
1142 | res\values
1143 | 1
1144 |
1145 |
1146 | res\values
1147 | 1
1148 |
1149 |
1150 |
1151 |
1152 | 1
1153 |
1154 |
1155 | Contents\MacOS
1156 | 1
1157 |
1158 |
1159 | 0
1160 |
1161 |
1162 |
1163 |
1164 | Contents\MacOS
1165 | 1
1166 | .framework
1167 |
1168 |
1169 | Contents\MacOS
1170 | 1
1171 | .framework
1172 |
1173 |
1174 | 0
1175 |
1176 |
1177 |
1178 |
1179 | 1
1180 | .dylib
1181 |
1182 |
1183 | 1
1184 | .dylib
1185 |
1186 |
1187 | 1
1188 | .dylib
1189 |
1190 |
1191 | Contents\MacOS
1192 | 1
1193 | .dylib
1194 |
1195 |
1196 | Contents\MacOS
1197 | 1
1198 | .dylib
1199 |
1200 |
1201 | 0
1202 | .dll;.bpl
1203 |
1204 |
1205 |
1206 |
1207 | 1
1208 | .dylib
1209 |
1210 |
1211 | 1
1212 | .dylib
1213 |
1214 |
1215 | 1
1216 | .dylib
1217 |
1218 |
1219 | Contents\MacOS
1220 | 1
1221 | .dylib
1222 |
1223 |
1224 | Contents\MacOS
1225 | 1
1226 | .dylib
1227 |
1228 |
1229 | 0
1230 | .bpl
1231 |
1232 |
1233 |
1234 |
1235 | 0
1236 |
1237 |
1238 | 0
1239 |
1240 |
1241 | 0
1242 |
1243 |
1244 | 0
1245 |
1246 |
1247 | 0
1248 |
1249 |
1250 | Contents\Resources\StartUp\
1251 | 0
1252 |
1253 |
1254 | Contents\Resources\StartUp\
1255 | 0
1256 |
1257 |
1258 | 0
1259 |
1260 |
1261 |
1262 |
1263 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1264 | 1
1265 |
1266 |
1267 |
1268 |
1269 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1270 | 1
1271 |
1272 |
1273 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1274 | 1
1275 |
1276 |
1277 |
1278 |
1279 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1280 | 1
1281 |
1282 |
1283 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1284 | 1
1285 |
1286 |
1287 |
1288 |
1289 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1290 | 1
1291 |
1292 |
1293 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1294 | 1
1295 |
1296 |
1297 |
1298 |
1299 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1300 | 1
1301 |
1302 |
1303 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1304 | 1
1305 |
1306 |
1307 |
1308 |
1309 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1310 | 1
1311 |
1312 |
1313 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1314 | 1
1315 |
1316 |
1317 |
1318 |
1319 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1320 | 1
1321 |
1322 |
1323 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1324 | 1
1325 |
1326 |
1327 |
1328 |
1329 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1330 | 1
1331 |
1332 |
1333 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1334 | 1
1335 |
1336 |
1337 |
1338 |
1339 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1340 | 1
1341 |
1342 |
1343 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1344 | 1
1345 |
1346 |
1347 |
1348 |
1349 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1350 | 1
1351 |
1352 |
1353 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1354 | 1
1355 |
1356 |
1357 |
1358 |
1359 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1360 | 1
1361 |
1362 |
1363 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1364 | 1
1365 |
1366 |
1367 |
1368 |
1369 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1370 | 1
1371 |
1372 |
1373 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1374 | 1
1375 |
1376 |
1377 |
1378 |
1379 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1380 | 1
1381 |
1382 |
1383 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1384 | 1
1385 |
1386 |
1387 |
1388 |
1389 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1390 | 1
1391 |
1392 |
1393 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1394 | 1
1395 |
1396 |
1397 |
1398 |
1399 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1400 | 1
1401 |
1402 |
1403 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1404 | 1
1405 |
1406 |
1407 |
1408 |
1409 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1410 | 1
1411 |
1412 |
1413 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1414 | 1
1415 |
1416 |
1417 |
1418 |
1419 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1420 | 1
1421 |
1422 |
1423 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1424 | 1
1425 |
1426 |
1427 |
1428 |
1429 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1430 | 1
1431 |
1432 |
1433 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1434 | 1
1435 |
1436 |
1437 |
1438 |
1439 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1440 | 1
1441 |
1442 |
1443 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1444 | 1
1445 |
1446 |
1447 |
1448 |
1449 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1450 | 1
1451 |
1452 |
1453 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1454 | 1
1455 |
1456 |
1457 |
1458 |
1459 | 1
1460 |
1461 |
1462 | 1
1463 |
1464 |
1465 |
1466 |
1467 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
1468 | 1
1469 |
1470 |
1471 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
1472 | 1
1473 |
1474 |
1475 |
1476 |
1477 | ..\
1478 | 1
1479 |
1480 |
1481 | ..\
1482 | 1
1483 |
1484 |
1485 |
1486 |
1487 | 1
1488 |
1489 |
1490 | 1
1491 |
1492 |
1493 | 1
1494 |
1495 |
1496 |
1497 |
1498 | ..\$(PROJECTNAME).launchscreen
1499 | 64
1500 |
1501 |
1502 | ..\$(PROJECTNAME).launchscreen
1503 | 64
1504 |
1505 |
1506 |
1507 |
1508 | 1
1509 |
1510 |
1511 | 1
1512 |
1513 |
1514 | 1
1515 |
1516 |
1517 |
1518 |
1519 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
1520 | 1
1521 |
1522 |
1523 |
1524 |
1525 | ..\
1526 | 1
1527 |
1528 |
1529 | ..\
1530 | 1
1531 |
1532 |
1533 |
1534 |
1535 | Contents
1536 | 1
1537 |
1538 |
1539 | Contents
1540 | 1
1541 |
1542 |
1543 |
1544 |
1545 | Contents\Resources
1546 | 1
1547 |
1548 |
1549 | Contents\Resources
1550 | 1
1551 |
1552 |
1553 |
1554 |
1555 | library\lib\armeabi-v7a
1556 | 1
1557 |
1558 |
1559 | library\lib\arm64-v8a
1560 | 1
1561 |
1562 |
1563 | 1
1564 |
1565 |
1566 | 1
1567 |
1568 |
1569 | 1
1570 |
1571 |
1572 | 1
1573 |
1574 |
1575 | Contents\MacOS
1576 | 1
1577 |
1578 |
1579 | Contents\MacOS
1580 | 1
1581 |
1582 |
1583 | 0
1584 |
1585 |
1586 |
1587 |
1588 | library\lib\armeabi-v7a
1589 | 1
1590 |
1591 |
1592 |
1593 |
1594 | 1
1595 |
1596 |
1597 | 1
1598 |
1599 |
1600 |
1601 |
1602 | Assets
1603 | 1
1604 |
1605 |
1606 | Assets
1607 | 1
1608 |
1609 |
1610 |
1611 |
1612 | Assets
1613 | 1
1614 |
1615 |
1616 | Assets
1617 | 1
1618 |
1619 |
1620 |
1621 |
1622 |
1623 |
1624 |
1625 |
1626 |
1627 |
1628 |
1629 |
1630 |
1631 |
1632 | True
1633 | True
1634 | True
1635 | True
1636 | True
1637 | True
1638 | True
1639 |
1640 |
1641 | 12
1642 |
1643 |
1644 |
1645 |
1646 |
1647 |
--------------------------------------------------------------------------------
/addp_SAF.dproj.local:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 1899.12.30 00:00:00.000.497,C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Androidapi.bizim.pas=
5 | 1899.12.30 00:00:00.000.336,C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\addp_SAF.dproj=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\XXXX_SAF.dproj
6 | 1899.12.30 00:00:00.000.594,C:\1\Progdil\Delphi\Projeler\Unit1.fmx=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Unit1.fmx
7 | 1899.12.30 00:00:00.000.842,C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\SAFAndroidDosyaDepolamaPaylasma2.dproj=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\ADDP_SAF.dproj
8 | 1899.12.30 00:00:00.000.837,C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\AndroidDosyaDepolamaPaylasma2SAF.dproj=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\SAFAndroidDosyaDepolamaPaylasma2.dproj
9 | 1899.12.30 00:00:00.000.112,C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Androidapi.bizim.pas=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Unit2.pas
10 | 1899.12.30 00:00:00.000.594,C:\1\Progdil\Delphi\Projeler\Unit1.pas=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Unit1.pas
11 | 1899.12.30 00:00:00.000.562,C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\XXXX_SAF.dproj=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\ADDP_SAF.dproj
12 | 1899.12.30 00:00:00.000.965,C:\1\Progdil\Delphi\Projeler\Project1.dproj=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\AndroidDosyaDepolamaPaylasma2SAF.dproj
13 | 1899.12.30 00:00:00.000.623,=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\delphican.pdf
14 | 1899.12.30 00:00:00.000.386,=C:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Unit2.pas
15 | 1899.12.30 00:00:00.000.325,=C:\1\Progdil\Delphi\Projeler\Unit1.pas
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/addp_SAF.identcache:
--------------------------------------------------------------------------------
1 | GC:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\Unit1.pas JC:\1\Progdil\Delphi\Projeler\AndroidDosyaDepolamaPaylasma2SAF\addp_SAF.dpr
--------------------------------------------------------------------------------
/addp_SAF.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/emozgun/delphi-android-SAF/b056d5f82033ffaa5bac9898fc3ebe1b274af0ec/addp_SAF.res
--------------------------------------------------------------------------------
/delphican.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/emozgun/delphi-android-SAF/b056d5f82033ffaa5bac9898fc3ebe1b274af0ec/delphican.pdf
--------------------------------------------------------------------------------