Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Constants](https://developer.android.com/reference/android/app/slice/SliceProvider#constants) \| [Inherited Constants](https://developer.android.com/reference/android/app/slice/SliceProvider#inhconstants) \| [Ctors](https://developer.android.com/reference/android/app/slice/SliceProvider#pubctors) \| [Methods](https://developer.android.com/reference/android/app/slice/SliceProvider#pubmethods) \| [Inherited Methods](https://developer.android.com/reference/android/app/slice/SliceProvider#inhmethods)

# SliceProvider

*** ** * ** ***


`
public


abstract
class
SliceProvider
`


`


`

`

extends https://developer.android.com/reference/android/content/ContentProvider


`

`


`

|---|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) |||
| ↳ | [android.content.ContentProvider](https://developer.android.com/reference/android/content/ContentProvider) ||
|   | ↳ | android.app.slice.SliceProvider |

<br />

*** ** * ** ***


**This class was deprecated
in API level 35.**   

Slice framework has been deprecated, it will not receive any updates from
`https://developer.android.com/` and forward. If you are looking for a
framework that sends displayable data from one app to another, consider using
`https://developer.android.com/reference/android/app/appsearch/AppSearchManager`.

A SliceProvider allows an app to provide content to be displayed in system spaces. This content
is templated and can contain actions, and the behavior of how it is surfaced is specific to the
system surface.


Slices are not currently live content. They are bound once and shown to the user. If the content
changes due to a callback from user interaction, then
`https://developer.android.com/reference/android/content/ContentResolver#notifyChange(android.net.Uri,%20android.database.ContentObserver)` should be used to notify the system.


The provider needs to be declared in the manifest to provide the authority for the app. The
authority for most slices is expected to match the package of the application.

```
 <provider
     android:name="com.example.mypkg.MySliceProvider"
     android:authorities="com.example.mypkg" />
 
```


Slices can be identified by a Uri or by an Intent. To link an Intent with a slice, the provider
must have an `https://developer.android.com/reference/android/content/IntentFilter` matching the slice intent. When a slice is being requested via
an intent, `https://developer.android.com/reference/android/app/slice/SliceProvider#onMapIntentToUri(android.content.Intent)` can be called and is expected to return an
appropriate Uri representing the slice.

```
 <provider
     android:name="com.example.mypkg.MySliceProvider"
     android:authorities="com.example.mypkg">
     <intent-filter>
         <action android:name="com.example.mypkg.intent.action.MY_SLICE_INTENT" />
         <category android:name="android.app.slice.category.SLICE" />
     </intent-filter>
 </provider>
 
```

<br />

**See also:**

- `https://developer.android.com/reference/android/app/slice/Slice`

## Summary

| ### Constants ||
|---|---|
| `https://developer.android.com/reference/java/lang/String` | `https://developer.android.com/reference/android/app/slice/SliceProvider#SLICE_TYPE` This is the Android platform's MIME type for a URI containing a slice implemented through `https://developer.android.com/reference/android/app/slice/SliceProvider`. |

| ### Inherited constants |
|---|
| From interface `https://developer.android.com/reference/android/content/ComponentCallbacks2` |---|---| | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_BACKGROUND` Level for `https://developer.android.com/reference/android/content/ComponentCallbacks2#onTrimMemory(int)`: the process has gone on to the LRU list. | | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_COMPLETE` *This constant was deprecated in API level 35. Apps are not notified of this level since API level 34* | | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_MODERATE` *This constant was deprecated in API level 35. Apps are not notified of this level since API level 34* | | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_RUNNING_CRITICAL` *This constant was deprecated in API level 35. Apps are not notified of this level since API level 34* | | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_RUNNING_LOW` *This constant was deprecated in API level 35. Apps are not notified of this level since API level 34* | | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_RUNNING_MODERATE` *This constant was deprecated in API level 35. Apps are not notified of this level since API level 34* | | `int` | `https://developer.android.com/reference/android/content/ComponentCallbacks2#TRIM_MEMORY_UI_HIDDEN` Level for `https://developer.android.com/reference/android/content/ComponentCallbacks2#onTrimMemory(int)`: the process had been showing a user interface, and is no longer doing so. | |

| ### Public constructors ||
|---|---|
| ` https://developer.android.com/reference/android/app/slice/SliceProvider#SliceProvider()() ` |
| ` https://developer.android.com/reference/android/app/slice/SliceProvider#SliceProvider(java.lang.String[])(https://developer.android.com/reference/java/lang/String autoGrantPermissions) ` A version of constructing a SliceProvider that allows autogranting slice permissions to apps that hold specific platform permissions. |

| ### Public methods ||
|---|---|
| ` void` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#attachInfo(android.content.Context,%20android.content.pm.ProviderInfo)(https://developer.android.com/reference/android/content/Context context, https://developer.android.com/reference/android/content/pm/ProviderInfo info) ` After being instantiated, this is called to tell the content provider about itself. |
| ` https://developer.android.com/reference/android/os/Bundle` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#call(java.lang.String,%20java.lang.String,%20android.os.Bundle)(https://developer.android.com/reference/java/lang/String method, https://developer.android.com/reference/java/lang/String arg, https://developer.android.com/reference/android/os/Bundle extras) ` |
| ` final int` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#delete(android.net.Uri,%20java.lang.String,%20java.lang.String[])(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs) ` Implement this to handle requests to delete one or more rows. |
| ` final https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#getType(android.net.Uri)(https://developer.android.com/reference/android/net/Uri uri) ` Implement this to handle requests for the MIME type of the data at the given URI. |
| ` final https://developer.android.com/reference/android/net/Uri` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#insert(android.net.Uri,%20android.content.ContentValues)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values) ` Implement this to handle requests to insert a new row. |
| ` https://developer.android.com/reference/android/app/slice/Slice` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#onBindSlice(android.net.Uri,%20java.util.Set<android.app.slice.SliceSpec>)(https://developer.android.com/reference/android/net/Uri sliceUri, https://developer.android.com/reference/java/util/Set<https://developer.android.com/reference/android/app/slice/SliceSpec> supportedSpecs) ` Implemented to create a slice. |
| ` https://developer.android.com/reference/android/app/PendingIntent` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#onCreatePermissionRequest(android.net.Uri)(https://developer.android.com/reference/android/net/Uri sliceUri) ` Called when an app requests a slice it does not have write permission to the uri for. |
| ` https://developer.android.com/reference/java/util/Collection<https://developer.android.com/reference/android/net/Uri>` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#onGetSliceDescendants(android.net.Uri)(https://developer.android.com/reference/android/net/Uri uri) ` Obtains a list of slices that are descendants of the specified Uri. |
| ` https://developer.android.com/reference/android/net/Uri` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#onMapIntentToUri(android.content.Intent)(https://developer.android.com/reference/android/content/Intent intent) ` This method must be overridden if an `https://developer.android.com/reference/android/content/IntentFilter` is specified on the SliceProvider. |
| ` void` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#onSlicePinned(android.net.Uri)(https://developer.android.com/reference/android/net/Uri sliceUri) ` Called to inform an app that a slice has been pinned. |
| ` void` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#onSliceUnpinned(android.net.Uri)(https://developer.android.com/reference/android/net/Uri sliceUri) ` Called to inform an app that a slices is no longer pinned. |
| ` final https://developer.android.com/reference/android/database/Cursor` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#query(android.net.Uri,%20java.lang.String[],%20android.os.Bundle,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String projection, https://developer.android.com/reference/android/os/Bundle queryArgs, https://developer.android.com/reference/android/os/CancellationSignal cancellationSignal) ` Implement this to handle query requests where the arguments are packed into a `https://developer.android.com/reference/android/os/Bundle`. |
| ` final https://developer.android.com/reference/android/database/Cursor` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String projection, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs, https://developer.android.com/reference/java/lang/String sortOrder) ` Implement this to handle query requests from clients. |
| ` final https://developer.android.com/reference/android/database/Cursor` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String projection, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs, https://developer.android.com/reference/java/lang/String sortOrder, https://developer.android.com/reference/android/os/CancellationSignal cancellationSignal) ` Implement this to handle query requests from clients with support for cancellation. |
| ` final int` | ` https://developer.android.com/reference/android/app/slice/SliceProvider#update(android.net.Uri,%20android.content.ContentValues,%20java.lang.String,%20java.lang.String[])(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs) ` Implement this to handle requests to update one or more rows. |

| ### Inherited methods |
|---|---|
| From class ` https://developer.android.com/reference/android/content/ContentProvider ` |---|---| | ` https://developer.android.com/reference/android/content/ContentProviderResult` | ` https://developer.android.com/reference/android/content/ContentProvider#applyBatch(java.lang.String,%20java.util.ArrayList<android.content.ContentProviderOperation>)(https://developer.android.com/reference/java/lang/String authority, https://developer.android.com/reference/java/util/ArrayList<https://developer.android.com/reference/android/content/ContentProviderOperation> operations) ` Override this to handle requests to perform a batch of operations, or the default implementation will iterate over the operations and call `https://developer.android.com/reference/android/content/ContentProviderOperation#apply(android.content.ContentProvider,%20android.content.ContentProviderResult[],%20int)` on each of them. | | ` https://developer.android.com/reference/android/content/ContentProviderResult` | ` https://developer.android.com/reference/android/content/ContentProvider#applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>)(https://developer.android.com/reference/java/util/ArrayList<https://developer.android.com/reference/android/content/ContentProviderOperation> operations) ` | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#attachInfo(android.content.Context,%20android.content.pm.ProviderInfo)(https://developer.android.com/reference/android/content/Context context, https://developer.android.com/reference/android/content/pm/ProviderInfo info) ` After being instantiated, this is called to tell the content provider about itself. | | ` int` | ` https://developer.android.com/reference/android/content/ContentProvider#bulkInsert(android.net.Uri,%20android.content.ContentValues[])(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values) ` Override this to handle requests to insert a set of new rows, or the default implementation will iterate over the values and call `https://developer.android.com/reference/android/content/ContentProvider#insert(android.net.Uri,%20android.content.ContentValues)` on each of them. | | ` https://developer.android.com/reference/android/os/Bundle` | ` https://developer.android.com/reference/android/content/ContentProvider#call(java.lang.String,%20java.lang.String,%20java.lang.String,%20android.os.Bundle)(https://developer.android.com/reference/java/lang/String authority, https://developer.android.com/reference/java/lang/String method, https://developer.android.com/reference/java/lang/String arg, https://developer.android.com/reference/android/os/Bundle extras) ` Call a provider-defined method. | | ` https://developer.android.com/reference/android/os/Bundle` | ` https://developer.android.com/reference/android/content/ContentProvider#call(java.lang.String,%20java.lang.String,%20android.os.Bundle)(https://developer.android.com/reference/java/lang/String method, https://developer.android.com/reference/java/lang/String arg, https://developer.android.com/reference/android/os/Bundle extras) ` | | ` https://developer.android.com/reference/android/net/Uri` | ` https://developer.android.com/reference/android/content/ContentProvider#canonicalize(android.net.Uri)(https://developer.android.com/reference/android/net/Uri url) ` Implement this to support canonicalization of URIs that refer to your content provider. | | ` final https://developer.android.com/reference/android/content/ContentProvider.CallingIdentity` | ` https://developer.android.com/reference/android/content/ContentProvider#clearCallingIdentity()() ` Reset the identity of the incoming IPC on the current thread. | | ` abstract int` | ` https://developer.android.com/reference/android/content/ContentProvider#delete(android.net.Uri,%20java.lang.String,%20java.lang.String[])(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs) ` Implement this to handle requests to delete one or more rows. | | ` int` | ` https://developer.android.com/reference/android/content/ContentProvider#delete(android.net.Uri,%20android.os.Bundle)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/os/Bundle extras) ` Implement this to handle requests to delete one or more rows. | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#dump(java.io.FileDescriptor,%20java.io.PrintWriter,%20java.lang.String[])(https://developer.android.com/reference/java/io/FileDescriptor fd, https://developer.android.com/reference/java/io/PrintWriter writer, https://developer.android.com/reference/java/lang/String args) ` Print the Provider's state into the given stream. | | ` final https://developer.android.com/reference/android/content/AttributionSource` | ` https://developer.android.com/reference/android/content/ContentProvider#getCallingAttributionSource()() ` Gets the attribution source of the calling app. | | ` final https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getCallingAttributionTag()() ` Return the attribution tag of the caller that initiated the request being processed on the current thread. | | ` final https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getCallingPackage()() ` Return the package name of the caller that initiated the request being processed on the current thread. | | ` final https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getCallingPackageUnchecked()() ` Return the package name of the caller that initiated the request being processed on the current thread. | | ` final https://developer.android.com/reference/android/content/Context` | ` https://developer.android.com/reference/android/content/ContentProvider#getContext()() ` Retrieves the Context this provider is running in. | | ` final https://developer.android.com/reference/android/content/pm/PathPermission` | ` https://developer.android.com/reference/android/content/ContentProvider#getPathPermissions()() ` Return the path-based permissions required for read and/or write access to this content provider. | | ` final https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getReadPermission()() ` Return the name of the permission required for read-only access to this content provider. | | ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getStreamTypes(android.net.Uri,%20java.lang.String)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mimeTypeFilter) ` Called by a client to determine the types of data streams that this content provider supports for the given URI. | | ` abstract https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getType(android.net.Uri)(https://developer.android.com/reference/android/net/Uri uri) ` Implement this to handle requests for the MIME type of the data at the given URI. | | ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getTypeAnonymous(android.net.Uri)(https://developer.android.com/reference/android/net/Uri uri) ` Implement this to handle requests for MIME type of URIs, that does not need to reveal any internal information which should be protected by any permission. | | ` final https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/content/ContentProvider#getWritePermission()() ` Return the name of the permission required for read/write access to this content provider. | | ` https://developer.android.com/reference/android/net/Uri` | ` https://developer.android.com/reference/android/content/ContentProvider#insert(android.net.Uri,%20android.content.ContentValues,%20android.os.Bundle)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values, https://developer.android.com/reference/android/os/Bundle extras) ` Implement this to handle requests to insert a new row. | | ` abstract https://developer.android.com/reference/android/net/Uri` | ` https://developer.android.com/reference/android/content/ContentProvider#insert(android.net.Uri,%20android.content.ContentValues)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values) ` Implement this to handle requests to insert a new row. | | ` boolean` | ` https://developer.android.com/reference/android/content/ContentProvider#isTemporary()() ` Returns true if this instance is a temporary content provider. | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#onCallingPackageChanged()() ` Called whenever the value of `https://developer.android.com/reference/android/content/ContentProvider#getCallingPackage()` changes, giving the provider an opportunity to invalidate any security related caching it may be performing. | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#onConfigurationChanged(android.content.res.Configuration)(https://developer.android.com/reference/android/content/res/Configuration newConfig) ` Called by the system when the device configuration changes while your component is running. This method is always called on the application main thread, and must not perform lengthy operations. | | ` abstract boolean` | ` https://developer.android.com/reference/android/content/ContentProvider#onCreate()() ` Implement this to initialize your content provider on startup. | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#onLowMemory()() ` This is called when the overall system is running low on memory, and actively running processes should trim their memory usage. This method is always called on the application main thread, and must not perform lengthy operations. | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#onTrimMemory(int)(int level) ` Called when the operating system has determined that it is a good time for a process to trim unneeded memory from its process. | | ` https://developer.android.com/reference/android/content/res/AssetFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openAssetFile(android.net.Uri,%20java.lang.String,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mode, https://developer.android.com/reference/android/os/CancellationSignal signal) ` This is like `https://developer.android.com/reference/android/content/ContentProvider#openFile(android.net.Uri,%20java.lang.String)`, but can be implemented by providers that need to be able to return sub-sections of files, often assets inside of their .apk. | | ` https://developer.android.com/reference/android/content/res/AssetFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openAssetFile(android.net.Uri,%20java.lang.String)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mode) ` This is like `https://developer.android.com/reference/android/content/ContentProvider#openFile(android.net.Uri,%20java.lang.String)`, but can be implemented by providers that need to be able to return sub-sections of files, often assets inside of their .apk. | | ` https://developer.android.com/reference/android/os/ParcelFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openFile(android.net.Uri,%20java.lang.String,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mode, https://developer.android.com/reference/android/os/CancellationSignal signal) ` Override this to handle requests to open a file blob. | | ` https://developer.android.com/reference/android/os/ParcelFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openFile(android.net.Uri,%20java.lang.String)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mode) ` Override this to handle requests to open a file blob. | | ` final https://developer.android.com/reference/android/os/ParcelFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openFileHelper(android.net.Uri,%20java.lang.String)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mode) ` Convenience for subclasses that wish to implement `https://developer.android.com/reference/android/content/ContentProvider#openFile(android.net.Uri,%20java.lang.String)` by looking up a column named "_data" at the given URI. | | ` <T> https://developer.android.com/reference/android/os/ParcelFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openPipeHelper(android.net.Uri,%20java.lang.String,%20android.os.Bundle,%20T,%20android.content.ContentProvider.PipeDataWriter<T>)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mimeType, https://developer.android.com/reference/android/os/Bundle opts, T args, https://developer.android.com/reference/android/content/ContentProvider.PipeDataWriter<T> func) ` A helper function for implementing `https://developer.android.com/reference/android/content/ContentProvider#openTypedAssetFile(android.net.Uri,%20java.lang.String,%20android.os.Bundle)`, for creating a data pipe and background thread allowing you to stream generated data back to the client. | | ` https://developer.android.com/reference/android/content/res/AssetFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openTypedAssetFile(android.net.Uri,%20java.lang.String,%20android.os.Bundle,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mimeTypeFilter, https://developer.android.com/reference/android/os/Bundle opts, https://developer.android.com/reference/android/os/CancellationSignal signal) ` Called by a client to open a read-only stream containing data of a particular MIME type. | | ` https://developer.android.com/reference/android/content/res/AssetFileDescriptor` | ` https://developer.android.com/reference/android/content/ContentProvider#openTypedAssetFile(android.net.Uri,%20java.lang.String,%20android.os.Bundle)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String mimeTypeFilter, https://developer.android.com/reference/android/os/Bundle opts) ` Called by a client to open a read-only stream containing data of a particular MIME type. | | ` https://developer.android.com/reference/android/database/Cursor` | ` https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20android.os.Bundle,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String projection, https://developer.android.com/reference/android/os/Bundle queryArgs, https://developer.android.com/reference/android/os/CancellationSignal cancellationSignal) ` Implement this to handle query requests where the arguments are packed into a `https://developer.android.com/reference/android/os/Bundle`. | | ` https://developer.android.com/reference/android/database/Cursor` | ` https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String projection, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs, https://developer.android.com/reference/java/lang/String sortOrder, https://developer.android.com/reference/android/os/CancellationSignal cancellationSignal) ` Implement this to handle query requests from clients with support for cancellation. | | ` abstract https://developer.android.com/reference/android/database/Cursor` | ` https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/java/lang/String projection, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs, https://developer.android.com/reference/java/lang/String sortOrder) ` Implement this to handle query requests from clients. | | ` boolean` | ` https://developer.android.com/reference/android/content/ContentProvider#refresh(android.net.Uri,%20android.os.Bundle,%20android.os.CancellationSignal)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/os/Bundle extras, https://developer.android.com/reference/android/os/CancellationSignal cancellationSignal) ` Implement this to support refresh of content identified by `uri`. | | ` final https://developer.android.com/reference/android/content/Context` | ` https://developer.android.com/reference/android/content/ContentProvider#requireContext()() ` Retrieves a Non-Nullable Context this provider is running in, this is intended to be called after `https://developer.android.com/reference/android/content/ContentProvider#onCreate()`. | | ` final void` | ` https://developer.android.com/reference/android/content/ContentProvider#restoreCallingIdentity(android.content.ContentProvider.CallingIdentity)(https://developer.android.com/reference/android/content/ContentProvider.CallingIdentity identity) ` Restore the identity of the incoming IPC on the current thread back to a previously identity that was returned by `https://developer.android.com/reference/android/content/ContentProvider#clearCallingIdentity()`. | | ` final void` | ` https://developer.android.com/reference/android/content/ContentProvider#setPathPermissions(android.content.pm.PathPermission[])(https://developer.android.com/reference/android/content/pm/PathPermission permissions) ` Change the path-based permission required to read and/or write data in the content provider. | | ` final void` | ` https://developer.android.com/reference/android/content/ContentProvider#setReadPermission(java.lang.String)(https://developer.android.com/reference/java/lang/String permission) ` Change the permission required to read data from the content provider. | | ` final void` | ` https://developer.android.com/reference/android/content/ContentProvider#setWritePermission(java.lang.String)(https://developer.android.com/reference/java/lang/String permission) ` Change the permission required to read and write data in the content provider. | | ` void` | ` https://developer.android.com/reference/android/content/ContentProvider#shutdown()() ` Implement this to shut down the ContentProvider instance. | | ` https://developer.android.com/reference/android/net/Uri` | ` https://developer.android.com/reference/android/content/ContentProvider#uncanonicalize(android.net.Uri)(https://developer.android.com/reference/android/net/Uri url) ` Remove canonicalization from canonical URIs previously returned by `https://developer.android.com/reference/android/content/ContentProvider#canonicalize(android.net.Uri)`. | | ` int` | ` https://developer.android.com/reference/android/content/ContentProvider#update(android.net.Uri,%20android.content.ContentValues,%20android.os.Bundle)(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values, https://developer.android.com/reference/android/os/Bundle extras) ` Implement this to handle requests to update one or more rows. | | ` abstract int` | ` https://developer.android.com/reference/android/content/ContentProvider#update(android.net.Uri,%20android.content.ContentValues,%20java.lang.String,%20java.lang.String[])(https://developer.android.com/reference/android/net/Uri uri, https://developer.android.com/reference/android/content/ContentValues values, https://developer.android.com/reference/java/lang/String selection, https://developer.android.com/reference/java/lang/String selectionArgs) ` Implement this to handle requests to update one or more rows. | ||
| From class ` https://developer.android.com/reference/java/lang/Object ` |---|---| | ` https://developer.android.com/reference/java/lang/Object` | ` https://developer.android.com/reference/java/lang/Object#clone()() ` Creates and returns a copy of this object. | | ` boolean` | ` https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object)(https://developer.android.com/reference/java/lang/Object obj) ` Indicates whether some other object is "equal to" this one. | | ` void` | ` https://developer.android.com/reference/java/lang/Object#finalize()() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. | | ` final https://developer.android.com/reference/java/lang/Class<?>` | ` https://developer.android.com/reference/java/lang/Object#getClass()() ` Returns the runtime class of this `Object`. | | ` int` | ` https://developer.android.com/reference/java/lang/Object#hashCode()() ` Returns a hash code value for the object. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#notify()() ` Wakes up a single thread that is waiting on this object's monitor. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#notifyAll()() ` Wakes up all threads that are waiting on this object's monitor. | | ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/java/lang/Object#toString()() ` Returns a string representation of the object. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait(long,%20int)(long timeoutMillis, int nanos) ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait(long)(long timeoutMillis) ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait()() ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*. | ||
| From interface ` https://developer.android.com/reference/android/content/ComponentCallbacks2 ` |---|---| | ` abstract void` | ` https://developer.android.com/reference/android/content/ComponentCallbacks2#onTrimMemory(int)(int level) ` Called when the operating system has determined that it is a good time for a process to trim unneeded memory from its process. | ||
| From interface ` https://developer.android.com/reference/android/content/ComponentCallbacks ` |---|---| | ` abstract void` | ` https://developer.android.com/reference/android/content/ComponentCallbacks#onConfigurationChanged(android.content.res.Configuration)(https://developer.android.com/reference/android/content/res/Configuration newConfig) ` Called by the system when the device configuration changes while your component is running. | | ` abstract void` | ` https://developer.android.com/reference/android/content/ComponentCallbacks#onLowMemory()() ` *This method was deprecated in API level 35. Since API level 14 this is superseded by `https://developer.android.com/reference/android/content/ComponentCallbacks2#onTrimMemory(int)`. Since API level 34 this is never called. If you're overriding ComponentCallbacks2#onTrimMemory and your minSdkVersion is greater than API 14, you can provide an empty implementation for this method.* | ||

## Constants

### SLICE_TYPE

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final String SLICE_TYPE
```

This is the Android platform's MIME type for a URI
containing a slice implemented through `https://developer.android.com/reference/android/app/slice/SliceProvider`.

<br />

Constant Value:

"vnd.android.slice"


## Public constructors

### SliceProvider

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public SliceProvider ()
```

<br />

<br />

### SliceProvider

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public SliceProvider (String... autoGrantPermissions)
```

A version of constructing a SliceProvider that allows autogranting slice permissions
to apps that hold specific platform permissions.


When an app tries to bind a slice from this provider that it does not have access to,
This provider will check if the caller holds permissions to any of the autoGrantPermissions
specified, if they do they will be granted persisted uri access to all slices of this
provider.

<br />

| Parameters ||
|---|---|
| `autoGrantPermissions` | `String`: List of permissions that holders are auto-granted access to slices. This value cannot be `null`. <br /> |

## Public methods

### attachInfo

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void attachInfo (Context context, 
                ProviderInfo info)
```

After being instantiated, this is called to tell the content provider
about itself.

<br />

| Parameters ||
|---|---|
| `context` | `Context`: The context this provider is running in <br /> |
| `info` | `ProviderInfo`: Registered information about this content provider <br /> |

### call

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public Bundle call (String method, 
                String arg, 
                Bundle extras)
```

<br />

<br />

| Parameters ||
|---|---|
| `method` | `String`: This value cannot be `null`. <br /> |
| `arg` | `String`: This value may be `null`. <br /> |
| `extras` | `Bundle`: This value may be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/os/Bundle` | This value may be `null`. <br /> |

### delete

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final int delete (Uri uri, 
                String selection, 
                String[] selectionArgs)
```

Implement this to handle requests to delete one or more rows. The
implementation should apply the selection clause when performing
deletion, allowing the operation to affect multiple rows in a directory.
As a courtesy, call
`https://developer.android.com/reference/android/content/ContentResolver#notifyChange(android.net.Uri,%20android.database.ContentObserver)` after deleting. This method can be called from multiple
threads, as described in [Processes
and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).


The implementation is responsible for parsing out a row ID at the end of
the URI, if a specific row is being deleted. That is, the client would
pass in `content://contacts/people/22` and the implementation
is responsible for parsing the record number (22) when creating a SQL
statement.

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: The full URI to query, including a row ID (if a specific record is requested). This value cannot be `null`. <br /> |
| `selection` | `String`: An optional restriction to apply to rows when deleting. This value may be `null`. <br /> |
| `selectionArgs` | `String`: This value may be `null`. <br /> |

| Returns ||
|---|---|
| `int` | The number of rows affected. <br /> |

### getType

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final String getType (Uri uri)
```

Implement this to handle requests for the MIME type of the data at the
given URI. The returned MIME type should start with
`vnd.android.cursor.item` for a single record,
or `vnd.android.cursor.dir/` for multiple items.
This method can be called from multiple threads, as described in
[Processes
and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).

Note that by default there are no permissions needed for an application to
access this information; if your content provider requires read and/or
write permissions, or is not exported, all applications can still call
this method regardless of their access permissions.

If your mime type reveals details that should be protected,
then you should protect this method by implementing `https://developer.android.com/reference/android/content/ContentProvider#getTypeAnonymous(android.net.Uri)`.
Implementing `https://developer.android.com/reference/android/content/ContentProvider#getTypeAnonymous(android.net.Uri)` ensures your `https://developer.android.com/reference/android/content/ContentProvider#getType(android.net.Uri)` can be
only accessed by caller's having associated readPermission for the URI.

<br />

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: the URI to query. This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/lang/String` | a MIME type string, or `null` if there is no type. <br /> |

### insert

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final Uri insert (Uri uri, 
                ContentValues values)
```

Implement this to handle requests to insert a new row. As a courtesy,
call
`https://developer.android.com/reference/android/content/ContentResolver#notifyChange(android.net.Uri,%20android.database.ContentObserver)` after inserting. This method can be called from multiple
threads, as described in [Processes
and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: The content:// URI of the insertion request. This value cannot be `null`. <br /> |
| `values` | `ContentValues`: A set of column_name/value pairs to add to the database. This value may be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/net/Uri` | The URI for the newly inserted item. This value may be `null`. <br /> |

### onBindSlice

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public Slice onBindSlice (Uri sliceUri, 
                Set<SliceSpec> supportedSpecs)
```

Implemented to create a slice.


onBindSlice should return as quickly as possible so that the UI tied
to this slice can be responsive. No network or other IO will be allowed
during onBindSlice. Any loading that needs to be done should happen
in the background with a call to `https://developer.android.com/reference/android/content/ContentResolver#notifyChange(android.net.Uri,%20android.database.ContentObserver)`
when the app is ready to provide the complete data in onBindSlice.


The slice returned should have a spec that is compatible with one of
the supported specs.

<br />

| Parameters ||
|---|---|
| `sliceUri` | `Uri`: Uri to bind. <br /> |
| `supportedSpecs` | `Set`: List of supported specs. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/app/slice/Slice` | <br /> |

**See also:**

- `https://developer.android.com/reference/android/app/slice/Slice`
- `https://developer.android.com/reference/android/app/slice/Slice#HINT_PARTIAL`

### onCreatePermissionRequest

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public PendingIntent onCreatePermissionRequest (Uri sliceUri)
```

Called when an app requests a slice it does not have write permission
to the uri for.


The return value will be the action on a slice that prompts the user that
the calling app wants to show slices from this app. The default implementation
launches a dialog that allows the user to grant access to this slice. Apps
that do not want to allow this user grant, can override this and instead
launch their own dialog with different behavior.

<br />

| Parameters ||
|---|---|
| `sliceUri` | `Uri`: the Uri of the slice attempting to be bound. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/app/PendingIntent` | This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/content/ContentProvider#getCallingPackage()`

### onGetSliceDescendants

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public Collection<Uri> onGetSliceDescendants (Uri uri)
```

Obtains a list of slices that are descendants of the specified Uri.


Implementing this is optional for a SliceProvider, but does provide a good
discovery mechanism for finding slice Uris.

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: The uri to look for descendants under. This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/Collection<https://developer.android.com/reference/android/net/Uri>` | All slices within the space. This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/app/slice/SliceManager#getSliceDescendants(android.net.Uri)`

### onMapIntentToUri

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public Uri onMapIntentToUri (Intent intent)
```

This method must be overridden if an `https://developer.android.com/reference/android/content/IntentFilter` is specified on the SliceProvider.
In that case, this method can be called and is expected to return a non-null Uri representing
a slice. Otherwise this will throw `https://developer.android.com/reference/java/lang/UnsupportedOperationException`.

Any intent filter added to a slice provider should also contain
`https://developer.android.com/reference/android/app/slice/SliceManager#CATEGORY_SLICE`, because otherwise it will not be detected by
`https://developer.android.com/reference/android/app/slice/SliceManager#mapIntentToUri(android.content.Intent)`.

<br />

| Parameters ||
|---|---|
| `intent` | `Intent` <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/net/Uri` | Uri representing the slice associated with the provided intent. <br /> |

**See also:**

- `https://developer.android.com/reference/android/app/slice/Slice`
- `https://developer.android.com/reference/android/app/slice/SliceManager#mapIntentToUri(android.content.Intent)`

### onSlicePinned

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void onSlicePinned (Uri sliceUri)
```

Called to inform an app that a slice has been pinned.


Pinning is a way that slice hosts use to notify apps of which slices
they care about updates for. When a slice is pinned the content is
expected to be relatively fresh and kept up to date.


Being pinned does not provide any escalated privileges for the slice
provider. So apps should do things such as turn on syncing or schedule
a job in response to a onSlicePinned.


Pinned state is not persisted through a reboot, and apps can expect a
new call to onSlicePinned for any slices that should remain pinned
after a reboot occurs.

<br />

| Parameters ||
|---|---|
| `sliceUri` | `Uri`: The uri of the slice being unpinned. <br /> |

**See also:**

- `https://developer.android.com/reference/android/app/slice/SliceProvider#onSliceUnpinned(android.net.Uri)`

### onSliceUnpinned

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void onSliceUnpinned (Uri sliceUri)
```

Called to inform an app that a slices is no longer pinned.


This means that no other apps on the device care about updates to this
slice anymore and therefore it is not important to be updated. Any syncs
or jobs related to this slice should be cancelled.

<br />

| Parameters ||
|---|---|
| `sliceUri` | `Uri` <br /> |

**See also:**

- `https://developer.android.com/reference/android/app/slice/SliceProvider#onSlicePinned(android.net.Uri)`

### query

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final Cursor query (Uri uri, 
                String[] projection, 
                Bundle queryArgs, 
                CancellationSignal cancellationSignal)
```

Implement this to handle query requests where the arguments are packed into a `https://developer.android.com/reference/android/os/Bundle`.
Arguments may include traditional SQL style query arguments. When present these
should be handled according to the contract established in
`https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String,%20android.os.CancellationSignal)`.

Traditional SQL arguments can be found in the bundle using the following keys:
- `https://developer.android.com/reference/android/content/ContentResolver#QUERY_ARG_SQL_SELECTION`
- `https://developer.android.com/reference/android/content/ContentResolver#QUERY_ARG_SQL_SELECTION_ARGS`
- `https://developer.android.com/reference/android/content/ContentResolver#QUERY_ARG_SQL_SORT_ORDER`

  This method can be called from multiple threads, as described in
  [Processes
  and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).


  Example client call:


  ```
  // Request 20 records starting at row index 30.
         Bundle queryArgs = new Bundle();
         queryArgs.putInt(ContentResolver.QUERY_ARG_OFFSET, 30);
         queryArgs.putInt(ContentResolver.QUERY_ARG_LIMIT, 20);

         Cursor cursor = getContentResolver().query(
                  contentUri,    // Content Uri is specific to individual content providers.
                  projection,    // String[] describing which columns to return.
                  queryArgs,     // Query arguments.
                  null);         // Cancellation signal.
  ```
  Example implementation:


  ```
          int recordsetSize = 0x1000;  // Actual value is implementation specific.
          queryArgs = queryArgs != null ? queryArgs : Bundle.EMPTY;  // ensure queryArgs is non-null

          int offset = queryArgs.getInt(ContentResolver.QUERY_ARG_OFFSET, 0);
          int limit = queryArgs.getInt(ContentResolver.QUERY_ARG_LIMIT, Integer.MIN_VALUE);

          MatrixCursor c = new MatrixCursor(PROJECTION, limit);

          // Calculate the number of items to include in the cursor.
          int numItems = MathUtils.constrain(recordsetSize - offset, 0, limit);

          // Build the paged result set....
          for (int i = offset; i < offset + numItems; i++) {
              // populate row from your data.
          }

          Bundle extras = new Bundle();
          c.setExtras(extras);

          // Any QUERY_ARG_* key may be included if honored.
          // In an actual implementation, include only keys that are both present in queryArgs
          // and reflected in the Cursor output. For example, if QUERY_ARG_OFFSET were included
          // in queryArgs, but was ignored because it contained an invalid value (like \u2013273),
          // then QUERY_ARG_OFFSET should be omitted.
          extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[] {
              ContentResolver.QUERY_ARG_OFFSET,
              ContentResolver.QUERY_ARG_LIMIT
          });

          extras.putInt(ContentResolver.EXTRA_TOTAL_COUNT, recordsetSize);

          cursor.setNotificationUri(getContext().getContentResolver(), uri);

          return cursor;
  ```


  See `https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String,%20android.os.CancellationSignal)`
  for implementation details.

  <br />

  | Parameters ||
  |---|---|
  | `uri` | `Uri`: The URI to query. This will be the full URI sent by the client. This value cannot be `null`. <br /> |
  | `projection` | `String`: The list of columns to put into the cursor. If `null` provide a default set of columns. <br /> |
  | `queryArgs` | `Bundle`: A Bundle containing additional information necessary for the operation. Arguments may include SQL style arguments, such as `https://developer.android.com/reference/android/content/ContentResolver#QUERY_ARG_SQL_LIMIT`, but note that the documentation for each individual provider will indicate which arguments they support. This value may be `null`. <br /> |
  | `cancellationSignal` | `CancellationSignal`: A signal to cancel the operation in progress, or `null`. <br /> |

  | Returns ||
  |---|---|
  | `https://developer.android.com/reference/android/database/Cursor` | a Cursor or `null`. <br /> |

### query

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final Cursor query (Uri uri, 
                String[] projection, 
                String selection, 
                String[] selectionArgs, 
                String sortOrder)
```

Implement this to handle query requests from clients.

Apps targeting `https://developer.android.com/reference/android/os/Build.VERSION_CODES#O` or higher should override
`https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20android.os.Bundle,%20android.os.CancellationSignal)` and provide a stub
implementation of this method.

This method can be called from multiple threads, as described in
[Processes
and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).


Example client call:


```
// Request a specific record.
 Cursor managedCursor = managedQuery(
                ContentUris.withAppendedId(Contacts.People.CONTENT_URI, 2),
                projection,    // Which columns to return.
                null,          // WHERE clause.
                null,          // WHERE clause value substitution
                People.NAME + " ASC");   // Sort order.
```
Example implementation:


```
// SQLiteQueryBuilder is a helper class that creates the
        // proper SQL syntax for us.
        SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();

        // Guard against SQL injection attacks
        qBuilder.setStrict(true);
        qBuilder.setProjectionMap(MAP_OF_QUERYABLE_COLUMNS);
        qBuilder.setStrictColumns(true);
        qBuilder.setStrictGrammar(true);

        // Set the table we're querying.
        qBuilder.setTables(DATABASE_TABLE_NAME);

        // If the query ends in a specific record number, we're
        // being asked for a specific record, so set the
        // WHERE clause in our query.
        if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
            qBuilder.appendWhere("_id=" + uri.getPathLeafId());
        }

        // Make the query.
        Cursor c = qBuilder.query(mDb,
                projection,
                selection,
                selectionArgs,
                groupBy,
                having,
                sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
```

<br />

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: The URI to query. This will be the full URI sent by the client; if the client is requesting a specific record, the URI will end in a record number that the implementation should parse and add to a WHERE or HAVING clause, specifying that _id value. This value cannot be `null`. <br /> |
| `projection` | `String`: The list of columns to put into the cursor. If `null` all columns are included. <br /> |
| `selection` | `String`: A selection criteria to apply when filtering rows. If `null` then all rows are included. <br /> |
| `selectionArgs` | `String`: You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings. This value may be `null`. <br /> |
| `sortOrder` | `String`: How the rows in the cursor should be sorted. If `null` then the provider is free to define the sort order. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/database/Cursor` | a Cursor or `null`. <br /> |

### query

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final Cursor query (Uri uri, 
                String[] projection, 
                String selection, 
                String[] selectionArgs, 
                String sortOrder, 
                CancellationSignal cancellationSignal)
```

Implement this to handle query requests from clients with support for cancellation.

Apps targeting `https://developer.android.com/reference/android/os/Build.VERSION_CODES#O` or higher should override
`https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20android.os.Bundle,%20android.os.CancellationSignal)` instead of this method.

This method can be called from multiple threads, as described in
[Processes
and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).


Example client call:


```
// Request a specific record.
 Cursor managedCursor = managedQuery(
                ContentUris.withAppendedId(Contacts.People.CONTENT_URI, 2),
                projection,    // Which columns to return.
                null,          // WHERE clause.
                null,          // WHERE clause value substitution
                People.NAME + " ASC");   // Sort order.
```
Example implementation:


```
// SQLiteQueryBuilder is a helper class that creates the
        // proper SQL syntax for us.
        SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();

        // Guard against SQL injection attacks
        qBuilder.setStrict(true);
        qBuilder.setProjectionMap(MAP_OF_QUERYABLE_COLUMNS);
        qBuilder.setStrictColumns(true);
        qBuilder.setStrictGrammar(true);

        // Set the table we're querying.
        qBuilder.setTables(DATABASE_TABLE_NAME);

        // If the query ends in a specific record number, we're
        // being asked for a specific record, so set the
        // WHERE clause in our query.
        if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
            qBuilder.appendWhere("_id=" + uri.getPathLeafId());
        }

        // Make the query.
        Cursor c = qBuilder.query(mDb,
                projection,
                selection,
                selectionArgs,
                groupBy,
                having,
                sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
```


If you implement this method then you must also implement the version of
`https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lang.String)` that does not take a cancellation
signal to ensure correct operation on older versions of the Android Framework in
which the cancellation signal overload was not available.

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: The URI to query. This will be the full URI sent by the client; if the client is requesting a specific record, the URI will end in a record number that the implementation should parse and add to a WHERE or HAVING clause, specifying that _id value. This value cannot be `null`. <br /> |
| `projection` | `String`: The list of columns to put into the cursor. If `null` all columns are included. <br /> |
| `selection` | `String`: A selection criteria to apply when filtering rows. If `null` then all rows are included. <br /> |
| `selectionArgs` | `String`: You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings. This value may be `null`. <br /> |
| `sortOrder` | `String`: How the rows in the cursor should be sorted. If `null` then the provider is free to define the sort order. <br /> |
| `cancellationSignal` | `CancellationSignal`: A signal to cancel the operation in progress, or `null` if none. If the operation is canceled, then `https://developer.android.com/reference/android/os/OperationCanceledException` will be thrown when the query is executed. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/database/Cursor` | a Cursor or `null`. <br /> |

### update

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public final int update (Uri uri, 
                ContentValues values, 
                String selection, 
                String[] selectionArgs)
```

Implement this to handle requests to update one or more rows. The
implementation should update all rows matching the selection to set the
columns according to the provided values map. As a courtesy, call
`https://developer.android.com/reference/android/content/ContentResolver#notifyChange(android.net.Uri,%20android.database.ContentObserver)` after updating. This method can be called from multiple
threads, as described in [Processes
and Threads](https://developer.android.com/guide/topics/fundamentals/processes-and-threads#Threads).

<br />

| Parameters ||
|---|---|
| `uri` | `Uri`: The URI to query. This can potentially have a record ID if this is an update request for a specific record. This value cannot be `null`. <br /> |
| `values` | `ContentValues`: A set of column_name/value pairs to update in the database. This value may be `null`. <br /> |
| `selection` | `String`: An optional filter to match rows to update. This value may be `null`. <br /> |
| `selectionArgs` | `String`: This value may be `null`. <br /> |

| Returns ||
|---|---|
| `int` | the number of rows affected. <br /> |