Udacity – czego nauczyłam się z kursu cz. 4

Content Providers – używane do wyciągania danych z wew. bazy telefonu, takich jak Kontakty, Dokumenty, Kalendarz lub też do używania bazy z innej aplikacji (jeśli takowa dostarcza ContentProvider)

1)      Uprawnienia do łączenia się z wybranym ContentProvider

W pliku manifest.xml

<uses-permission android:name=”com.example.udacity.droidtermsexample.TERMS_READ”></uses-permission>

2)      Połączenie z ContentProvider dostajemy przez ContentResolver (wywoływać zawsze w AsynCTask .doInBackground – jako, że jest to zasobożerne i może zwiesić aplikacje)

 

Cursor cur;
ContentResolver cr = getContentResolver();

Uri uri = Calendars.CONTENT_URI;
cur = cr.query(uri, null, null, null, null);

skąd wziąć dostępne w telefonie URI ?

 

używając tego kawalka kodu😉

    for (PackageInfo pack : getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS)) {
        ProviderInfo[] providers = pack.providers;
        if (providers != null) {
            for (ProviderInfo provider : providers) {
                Log.d("Example", "provider: " + provider.authority);
            }
        }
    }

 

Lub używając polecenia adb z konsoli:

C:\Users\username\AppData\Local\Android\Sdk\platform-tools>adb

Android Debug Bridge version 1.0.39

Version 0.0.1-4500957

Installed as C:\Users\magda\AppData\Local\Android\Sdk\platform-tools\adb.exe

 

global options:

 -a         listen on all network interfaces, not just localhost

 -d         use USB device (error if multiple devices connected)

 -e         use TCP/IP device (error if multiple TCP/IP devices available)

 -s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)

 -t ID      use device with given transport id

 -H         name of adb server host [default=localhost]

 -P         port of adb server [default=5037]

 -L SOCKET  listen on given socket for adb server [default=tcp:localhost:5037]

 

general commands:

 devices [-l]             list connected devices (-l for long output)

 help                     show this help message

 version                  show version num

 

networking:

 connect HOST[:PORT]      connect to a device via TCP/IP [default port=5555]

 disconnect [HOST[:PORT]]

     disconnect from given TCP/IP device [default port=5555], or all

 forward –list           list all forward socket connections

 forward [–no-rebind] LOCAL REMOTE

     forward socket connection using:

       tcp:<port> (<local> may be „tcp:0” to pick any open port)

       localabstract:<unix domain socket name>

       localreserved:<unix domain socket name>

       localfilesystem:<unix domain socket name>

       dev:<character device name>

       jdwp:<process pid> (remote only)

 forward –remove LOCAL   remove specific forward socket connection

 forward –remove-all     remove all forward socket connections

 ppp TTY [PARAMETER…]   run PPP over USB

 reverse –list           list all reverse socket connections from device

 reverse [–no-rebind] REMOTE LOCAL

     reverse socket connection using:

       tcp:<port> (<remote> may be „tcp:0” to pick any open port)

       localabstract:<unix domain socket name>

       localreserved:<unix domain socket name>

       localfilesystem:<unix domain socket name>

 reverse –remove REMOTE  remove specific reverse socket connection

 reverse –remove-all     remove all reverse socket connections from device

 

file transfer:

 push [–sync] LOCAL… REMOTE

     copy local files/directories to device

     –sync: only push files that are newer on the host than the device

 pull [-a] REMOTE… LOCAL

     copy files/dirs from device

     -a: preserve file timestamp and mode

 sync [system|vendor|oem|data|all]

     sync a local build from $ANDROID_PRODUCT_OUT to the device (default all)

     -l: list but don’t copy

 

shell:

 shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND…]

     run remote shell command (interactive shell if no command given)

     -e: choose escape character, or „none”; default ‚~’

     -n: don’t read from stdin

     -T: disable PTY allocation

     -t: force PTY allocation

     -x: disable remote exit codes and stdout/stderr separation

 emu COMMAND              run emulator console command

 

app installation:

 install [-lrtsdg] PACKAGE

 install-multiple [-lrtsdpg] PACKAGE…

     push package(s) to the device and install them

     -l: forward lock application

     -r: replace existing application

     -t: allow test packages

     -s: install application on sdcard

     -d: allow version code downgrade (debuggable packages only)

     -p: partial application install (install-multiple only)

     -g: grant all runtime permissions

 uninstall [-k] PACKAGE

     remove this app package from the device

     ‚-k’: keep the data and cache directories

 

backup/restore:

   to show usage run „adb shell bu help”

 

debugging:

 bugreport [PATH]

     write bugreport to given PATH [default=bugreport.zip];

     if PATH is a directory, the bug report is saved in that directory.

     devices that don’t support zipped bug reports output to stdout.

 jdwp                     list pids of processes hosting a JDWP transport

 logcat                   show device log (logcat –help for more)

 

security:

 disable-verity           disable dm-verity checking on userdebug builds

 enable-verity            re-enable dm-verity checking on userdebug builds

 keygen FILE

     generate adb public/private key; private key stored in FILE,

     public key stored in FILE.pub (existing files overwritten)

 

scripting:

 wait-for[-TRANSPORT]-STATE

     wait for device to be in the given state

     State: device, recovery, sideload, or bootloader

     Transport: usb, local, or any [default=any]

 get-state                print offline | bootloader | device

 get-serialno             print <serial-number>

 get-devpath              print <device-path>

 remount

     remount /system, /vendor, and /oem partitions read-write

 reboot [bootloader|recovery|sideload|sideload-auto-reboot]

     reboot the device; defaults to booting system image but

     supports bootloader and recovery too. sideload reboots

     into recovery and automatically starts sideload mode,

     sideload-auto-reboot is the same but reboots after sideloading.

 sideload OTAPACKAGE      sideload the given full OTA package

 root                     restart adbd with root permissions

 unroot                   restart adbd without root permissions

 usb                      restart adb server listening on USB

 tcpip PORT               restart adb server listening on TCP on PORT

 

internal debugging:

 start-server             ensure that there is a server running

 kill-server              kill the server if it is running

 reconnect                kick connection from host side to force reconnect

 reconnect device         kick connection from device side to force reconnect

 reconnect offline        reset offline/unauthorized devices to force reconnect

 

environment variables:

 $ADB_TRACE

     comma-separated list of debug info to log:

     all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp

 $ADB_VENDOR_KEYS         colon-separated list of keys (files or directories)

 $ANDROID_SERIAL          serial number to connect to (see -s)

 $ANDROID_LOG_TAGS        tags to be used by logcat (see logcat –help)

 

https://developer.android.com/studio/command-line/adb.html#shellcommands

https://developer.android.com/studio/command-line/dumpsys.html

Wpisujemy :

 

adb shell dumpsys

 

 

i szukamy w sekcji Registered Providers, która wygląda mniej więcej tak:

 

Registered ContentProviders:

  com.mobisystems.office/com.mobisystems.provider.ProviderWrapper:

    Provider{3500dfb com.mobisystems.office/com.mobisystems.provider.ProviderWrapper}

 

  com.android.chrome/android.support.v4.content.FileProvider:

    Provider{187a9e18 com.android.chrome/android.support.v4.content.FileProvider}

 

  com.sonyericsson.music/.metadata.GracenoteProvider:

    Provider{26f0d071 com.sonyericsson.music/.metadata.GracenoteProvider}

 

  com.android.email/.provider.EmailSearchSuggestionProvider:

    Provider{1c715e56 com.android.email/.provider.EmailSearchSuggestionProvider}

 

  com.google.android.gms/.fonts.provider.FontsProvider:

    Provider{33878ed7 com.google.android.gms/.fonts.provider.FontsProvider}

 

  com.android.chrome/com.google.android.apps.chrome.ChromeBrowserProvider:

    Provider{f8783c4 com.android.chrome/com.google.android.apps.chrome.ChromeBrowserProvider}

 

  com.sonyericsson.video/.metadata.provider.MetadataProvider:

    Provider{147102ad com.sonyericsson.video/.metadata.provider.MetadataProvider}

 

  com.android.htmlviewer/.FileContentProvider:

    Provider{21bd09e2 com.android.htmlviewer/.FileContentProvider}

 

  com.mobisystems.office/com.mobisystems.connect.client.push.MSFirebaseInitProvider:

    Provider{3d4c4173 com.mobisystems.office/com.mobisystems.connect.client.push.MSFirebaseInitProvider}

 

3)operacje na danych z ContentResolver:

 

a)wybieranie danych

Cursor cur;
ContentResolver cr = getContentResolver();

Uri uri = Calendars.CONTENT_URI;
cur = cr.query(uri, null, null, null, null);
int wordCol = cursor.getColumnIndex(GlossaryContract.COLUMN_WORD);
int definitionCol = cursor.getColumnIndex(GlossaryContract.COLUMN_DEFINITION);
while (cursor.moveToNext()) {
String word = cursor.getString(wordCol);
String definition = cursor.getString(definitionCol);
Log.v(“Cursor Example”, word + “ - “ + definition);

}

cursor.Close();

 

b) wstawienie danych

ContentRecsolver.insert

 

mNewValues.put(UserDictionary.Words.APP_ID, "example.user");

mNewValues.put(UserDictionary.Words.LOCALE, "en_US");

mNewValues.put(UserDictionary.Words.WORD, "insert");

mNewValues.put(UserDictionary.Words.FREQUENCY, "100");


mNewUri = getContentResolver().insert(

    UserDictionary.Word.CONTENT_URI,   // the user dictionary content URI

    mNewValues                          // the values to insert

);

 

c) aktualizowanie danych

ContentRecsolver.update

 

mUpdateValues.putNull(UserDictionary.Words.LOCALE);


mRowsUpdated = getContentResolver().update(

    UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI

    mUpdateValues                       // the columns to update

    mSelectionClause                    // the column to select on

    mSelectionArgs                      // the value to compare to

);

d) kasowanie danych

ContentRecsolver.delete

 

// Deletes the words that match the selection criteria

mRowsDeleted = getContentResolver().delete(

    UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI

    mSelectionClause                    // the column to select on

    mSelectionArgs                      // the value to compare to

);

 

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *