├── 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 | ![](https://img.shields.io/badge/ObjectPascal-Delphi-red) 4 | ![](https://img.shields.io/badge/Android-SAF-brightgreen) 5 | ![Stars](https://img.shields.io/github/stars/emozgun/delphi-android-SAF) 6 | ![Issues](https://img.shields.io/github/issues/emozgun/delphi-android-SAF) 7 | 8 | Original in Turkish 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 |
Form1
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.pasJC:\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 --------------------------------------------------------------------------------