Flutter plugin to use ContentProvider/ContentResolver APIs on Android

Overview

android_content_provider

This plugin exposes ContentProvider and related ContentResolver APIs on Android.

Android 11 package visibility

Android 11 introduced a security mechanism that is called a package visibility.

If you are using AndroidContentResolver and trying to access some content provider within a package that is not visible by default, your app will fail to connect to it.

To fix this, add to your AndroidManifest.xml a new <queries> element:

<manifest>
...
    <queries>
        <package android:name="com.example.app" />
    </queries>
...
</manifest>

Configuring AndroidContentProvider

You may ignore these steps if you only want to use AndroidContentResolver.

  1. Use the FlutterEngineGroup, provided by the plugin, in your MainActivity to improve performance and reduce memory footprint from engine creation.

    This step is optional, but is strongly recommended.

  • Kotlin
import android.content.Context
import com.nt4f04und.android_content_provider.AndroidContentProvider
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine

class MainActivity : FlutterActivity() {
    override fun provideFlutterEngine(context: Context): FlutterEngine? {
        return AndroidContentProvider.getFlutterEngineGroup(this)
                .createAndRunDefaultEngine(this)
    }
}
  • Java
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.nt4f04und.android_content_provider.AndroidContentProvider;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;

public class MainActivity extends FlutterActivity {
    @Nullable
    @Override
    public FlutterEngine provideFlutterEngine(@NonNull Context context) {
        return AndroidContentProvider.Companion.getFlutterEngineGroup(this)
                .createAndRunDefaultEngine(this);
    }
}
  1. Subclass AndroidContentProvider in native code, setting the authority and Dart entrypoint name you want to use
  • Kotlin
import com.nt4f04und.android_content_provider.AndroidContentProvider

class MyAndroidContentProvider : AndroidContentProvider() {
   override val authority: String = "com.example.myapp.MyAndroidContentProvider"
   override val entrypointName = "exampleContentProviderEntrypoint"
}
  • Java
import com.nt4f04und.android_content_provider.AndroidContentProvider;

import org.jetbrains.annotations.NotNull;

public class MyAndroidContentProvider extends AndroidContentProvider {
    @NotNull
    @Override
    public String getAuthority() {
        return "com.example.myapp.MyAndroidContentProvider";
    }

    @NotNull
    @Override
    public String getEntrypointName() {
        return "exampleContentProviderEntrypoint";
    }
}
  1. Declare your ContentProvider in the AndroidManifest.xml.
  • If you want to allow other apps to access the provider unconditionally
<provider
   android:name=".MyAndroidContentProvider"
   android:authorities="com.example.myapp.MyAndroidContentProvider"
   android:exported="true" />
  • If you want to make other apps declare <uses-permission>
<provider
   android:name=".MyAndroidContentProvider"
   android:authorities="com.example.myapp.MyAndroidContentProvider"
   android:exported="false"
   android:readPermission="com.example.myapp.permission.READ"
   android:writePermission="com.example.myapp.permission.WRITE" />
  1. Sublcass AndroidContentProvider in Dart code and override needed methods
import 'package:android_content_provider/android_content_provider.dart';

class MyAndroidContentProvider extends AndroidContentProvider {
  MyAndroidContentProvider(String authority) : super(authority);

  @override
  Future<int> delete(
    String uri,
    String? selection,
    List<String>? selectionArgs,
  ) async {
    return 0;
  }

  @override
  Future<String?> getType(String uri) async {
    return null;
  }

  @override
  Future<String?> insert(String uri, ContentValues? values) async {
    return null;
  }

  @override
  Future<CursorData?> query(
    String uri,
    List<String>? projection,
    String? selection,
    List<String>? selectionArgs,
    String? sortOrder,
  ) async {
    return null;
  }

  @override
  Future<int> update(
    String uri,
    ContentValues? values,
    String? selection,
    List<String>? selectionArgs,
  ) async {
    return 0;
  }
}
  1. Create the Dart entrypoint
@pragma('vm:entry-point')
void exampleContentProviderEntrypoint() {
  MyAndroidContentProvider('com.example.myapp.MyAndroidContentProvider');
}
You might also like...

A Flutter Plugin to visualize audio in android

A Flutter Plugin to visualize audio in android

flutter_visualizers (Depreciated & Not maintaining) A Flutter plugin to Visualize the audio being played (only android). Usage Add this to your pubspe

Nov 14, 2022

A robust Flutter plugin for making payments via Paystack Payment Gateway. Completely supports Android and iOS

A robust Flutter plugin for making payments via Paystack Payment Gateway. Completely supports Android and iOS

💳 Paystack Plugin for Flutter A Flutter plugin for making payments via Paystack Payment Gateway. Fully supports Android and iOS. 🚀 Installation To u

Jan 4, 2023

A Flutter plugin to retrieve and manage contacts on Android and iOS devices. Maintainer: @lukasgit

A Flutter plugin to retrieve and manage contacts on Android and iOS devices. Maintainer: @lukasgit

contacts_service A Flutter plugin to access and manage the device's contacts. Usage To use this plugin, add contacts_service as a dependency in your p

Dec 28, 2022

A Flutter plugin for playing music on iOS and Android.

Stereo plugin for Flutter A Flutter plugin for playing music on iOS and Android. Features Play/pause Stop Duration / seek to position Load track from

Sep 24, 2022

A flutter plugin for integrating razorpay payment gateway. Supports Android and iOS.

A flutter plugin for integrating razorpay payment gateway. Supports Android and iOS.

Flutter Razorpay Plugin A flutter plugin for razorpay integration for both android and ios. If you use this library in your app, please let me know an

Dec 13, 2022

A flutter IM plugin for android and ios

flutter_openim_sdk Download demo flutter_openim_widget A flutter IM plugin for android and ios. Getting Started 1,Add dependency in yaml flutter_op

Dec 3, 2021

A Flutter Plugin to check Android device Root status and execute shell commands with root privileges

root plugin A Flutter Plugin to check Android device Root status and Run shell commands in android(only). This plugin is based on Topjohnwu libsu and

Nov 15, 2022

Video player-2.2.10 - A Flutter plugin for iOS, Android and Web for playing back video on a Widget surface

Video player-2.2.10 - A Flutter plugin for iOS, Android and Web for playing back video on a Widget surface

Video Player plugin for Flutter A Flutter plugin for iOS, Android and Web for pl

Sep 29, 2022
Comments
  • Unable to get the provider

    Unable to get the provider

    Launching lib/main.dart on sdk gphone64 arm64 in debug mode... Running Gradle task 'assembleDebug'... ✓ Built build/app/outputs/flutter-apk/app-debug.apk. Installing build/app/outputs/flutter-apk/app.apk... E/AndroidRuntime(22557): FATAL EXCEPTION: main E/AndroidRuntime(22557): Process: com.example.content_provider, PID: 22557 E/AndroidRuntime(22557): java.lang.RuntimeException: Unable to get provider com.example.content_provider.MyAndroidContentProvider: java.lang.ClassNotFoundException: Didn't find class "com.example.content_provider.MyAndroidContentProvider" on path: DexPathList[[zip file "/data/app/~~FJz_B56z_SzEzgvhvEwn3g==/com.example.content_provider-Xu7Gp4ZA7unlA_9hB2S6vA==/base.apk"],nativeLibraryDirectories=[/data/app/~~FJz_B56z_SzEzgvhvEwn3g==/com.example.content_provider-Xu7Gp4ZA7unlA_9hB2S6vA==/lib/arm64, /data/app/~~FJz_B56z_SzEzgvhvEwn3g==/com.example.content_provider-Xu7Gp4ZA7unlA_9hB2S6vA==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] E/AndroidRuntime(22557): at android.app.ActivityThread.installProvider(ActivityThread.java:7436) E/AndroidRuntime(22557): at android.app.ActivityThread.installContentProviders(ActivityThread.java:6948) E/AndroidRuntime(22557): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6719) E/AndroidRuntime(22557): at android.app.ActivityThread.access$1500(ActivityThread.java:256) E/AndroidRuntime(22557): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2090) E/AndroidRuntime(22557): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime(22557): at android.os.Looper.loopOnce(Looper.java:201) E/AndroidRuntime(22557): at android.os.Looper.loop(Looper.java:288) E/AndroidRuntime(22557): at android.app.ActivityThread.main(ActivityThread.java:7842) E/AndroidRuntime(22557): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(22557): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/AndroidRuntime(22557): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) E/AndroidRuntime(22557): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.content_provider.MyAndroidContentProvider" on path: DexPathList[[zip file "/data/app/~~FJz_B56z_SzEzgvhvEwn3g==/com.example.content_provider-Xu7Gp4ZA7unlA_9hB2S6vA==/base.apk"],nativeLibraryDirectories=[/data/app/~~FJz_B56z_SzEzgvhvEwn3g==/com.example.content_provider-Xu7Gp4ZA7unlA_9hB2S6vA==/lib/arm64, /data/app/~~FJz_B56z_SzEzgvhvEwn3g==/com.example.content_provider-Xu7Gp4ZA7unlA_9hB2S6vA==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] E/AndroidRuntime(22557): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) E/AndroidRuntime(22557): at java.lang.ClassLoader.loadClass(ClassLoader.java:379) E/AndroidRuntime(22557): at java.lang.ClassLoader.loadClass(ClassLoader.java:312) E/AndroidRuntime(22557): at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:147) E/AndroidRuntime(22557): at androidx.core.app.CoreComponentFactory.instantiateProvider(CoreComponentFactory.java:67) E/AndroidRuntime(22557): at android.app.ActivityThread.installProvider(ActivityThread.java:7420) E/AndroidRuntime(22557): ... 11 more

    opened by anmolguptach 2
  • Unable to get provider com.nt4f04und.android_content_provider_example.MyAndroidContentProvider

    Unable to get provider com.nt4f04und.android_content_provider_example.MyAndroidContentProvider

    Hello,

    I'm trying to add functionality of providing data to example. I'm following instructions in README and I did all steps.

    When I'm trying to build it - it stacks and shows me an error.

    Launching lib/main.dart on sdk gphone x86 in debug mode... ✓ Built build/app/outputs/flutter-apk/app-debug.apk. E/AndroidRuntime(10875): FATAL EXCEPTION: main E/AndroidRuntime(10875): Process: com.nt4f04und.android_content_provider_example, PID: 10875 E/AndroidRuntime(10875): java.lang.RuntimeException: Unable to get provider com.nt4f04und.android_content_provider_example.MyAndroidContentProvider: java.lang.ClassNotFoundException: Didn't find class "com.nt4f04und.android_content_provider_example.MyAndroidContentProvider" on path: DexPathList[[zip file "/data/app/~~qFgYI7_uF_VuZ7SP_YEthQ==/com.nt4f04und.android_content_provider_example-r0Iu4fuBXqpjGethMdzamA==/base.apk"],nativeLibraryDirectories=[/data/app/~~qFgYI7_uF_VuZ7SP_YEthQ==/com.nt4f04und.android_content_provider_example-r0Iu4fuBXqpjGethMdzamA==/lib/x86, /data/app/~~qFgYI7_uF_VuZ7SP_YEthQ==/com.nt4f04und.android_content_provider_example-r0Iu4fuBXqpjGethMdzamA==/base.apk!/lib/x86, /system/lib, /system_ext/lib]] E/AndroidRuntime(10875): at android.app.ActivityThread.installProvider(ActivityThread.java:7244) E/AndroidRuntime(10875): at android.app.ActivityThread.installContentProviders(ActivityThread.java:6780) E/AndroidRuntime(10875): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6697) E/AndroidRuntime(10875): at android.app.ActivityThread.access$1300(ActivityThread.java:237) E/AndroidRuntime(10875): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913) E/AndroidRuntime(10875): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime(10875): at android.os.Looper.loop(Looper.java:223) E/AndroidRuntime(10875): at android.app.ActivityThread.main(ActivityThread.java:7656) E/AndroidRuntime(10875): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(10875): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) E/AndroidRuntime(10875): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) E/AndroidRuntime(10875): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.nt4f04und.android_content_provider_example.MyAndroidContentProvider" on path: DexPathList[[zip file "/data/app/~~qFgYI7_uF_VuZ7SP_YEthQ==/com.nt4f04und.android_content_provider_example-r0Iu4fuBXqpjGethMdzamA==/base.apk"],nativeLibraryDirectories=[/data/app/~~qFgYI7_uF_VuZ7SP_YEthQ==/com.nt4f04und.android_content_provider_example-r0Iu4fuBXqpjGethMdzamA==/lib/x86, /data/app/~~qFgYI7_uF_VuZ7SP_YEthQ==/com.nt4f04und.android_content_provider_example-r0Iu4fuBXqpjGethMdzamA==/base.apk!/lib/x86, /system/lib, /system_ext/lib]] E/AndroidRuntime(10875): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) E/AndroidRuntime(10875): at java.lang.ClassLoader.loadClass(ClassLoader.java:379) E/AndroidRuntime(10875): at java.lang.ClassLoader.loadClass(ClassLoader.java:312) E/AndroidRuntime(10875): at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:147) E/AndroidRuntime(10875): at androidx.core.app.CoreComponentFactory.instantiateProvider(CoreComponentFactory.java:67) E/AndroidRuntime(10875): at android.app.ActivityThread.installProvider(ActivityThread.java:7228) E/AndroidRuntime(10875): ... 10 more Exited

    Looks like it failed to found instance of class MyAndroidContentProvider.

    opened by GlebUstimenkoWMG 2
  • Didn't find class

    Didn't find class "com.example.content_provider.MainActivity"

    Launching lib/main.dart on sdk gphone64 arm64 in debug mode... Running Gradle task 'assembleDebug'... ✓ Built build/app/outputs/flutter-apk/app-debug.apk. E/AndroidRuntime(23532): FATAL EXCEPTION: main E/AndroidRuntime(23532): Process: com.example.content_provider, PID: 23532 E/AndroidRuntime(23532): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.content_provider/com.example.content_provider.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.content_provider.MainActivity" on path: DexPathList[[zip file "/data/app/~~ri1EIfwfv0KCTArCWiLKXA==/com.example.content_provider-uH1AcXEyOAHOM6kIcsJS0Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~ri1EIfwfv0KCTArCWiLKXA==/com.example.content_provider-uH1AcXEyOAHOM6kIcsJS0Q==/lib/arm64, /data/app/~~ri1EIfwfv0KCTArCWiLKXA==/com.example.content_provider-uH1AcXEyOAHOM6kIcsJS0Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] E/AndroidRuntime(23532): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3591) E/AndroidRuntime(23532): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3842) E/AndroidRuntime(23532): at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) E/AndroidRuntime(23532): at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) E/AndroidRuntime(23532): at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) E/AndroidRuntime(23532): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252) E/AndroidRuntime(23532): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime(23532): at android.os.Looper.loopOnce(Looper.java:201) E/AndroidRuntime(23532): at android.os.Looper.loop(Looper.java:288) E/AndroidRuntime(23532): at android.app.ActivityThread.main(ActivityThread.java:7842) E/AndroidRuntime(23532): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(23532): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/AndroidRuntime(23532): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) E/AndroidRuntime(23532): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.content_provider.MainActivity" on path: DexPathList[[zip file "/data/app/~~ri1EIfwfv0KCTArCWiLKXA==/com.example.content_provider-uH1AcXEyOAHOM6kIcsJS0Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~ri1EIfwfv0KCTArCWiLKXA==/com.example.content_provider-uH1AcXEyOAHOM6kIcsJS0Q==/lib/arm64, /data/app/~~ri1EIfwfv0KCTArCWiLKXA==/com.example.content_provider-uH1AcXEyOAHOM6kIcsJS0Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] E/AndroidRuntime(23532): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) E/AndroidRuntime(23532): at java.lang.ClassLoader.loadClass(ClassLoader.java:379) E/AndroidRuntime(23532): at java.lang.ClassLoader.loadClass(ClassLoader.java:312) E/AndroidRuntime(23532): at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) E/AndroidRuntime(23532): at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) E/AndroidRuntime(23532): at android.app.Instrumentation.newActivity(Instrumentation.java:1285) E/AndroidRuntime(23532): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3578) E/AndroidRuntime(23532): ... 12 more

    opened by anmolguptach 1
Releases(0.2.2)
Owner
󠀡󠀡󠀡󠀡mute all chat √ 😉 🤡
null
Flutter e-Commerce application using APIs, Bloc, Dio, and Shared Preferences.

shop_in Flutter e-Commerce application using APIs, Bloc, Dio, and Shared Preferences. Onboarding screens with skip button. Login and register screens

Eslam Esmail 13 Oct 21, 2022
App de estudo para treino de layout e requisição de APIs. Faz conversão de real para 5 tipos de criptomoedas, exibe gráfico de evolução e as últimas notícias do mercado. Em construção.

cryptonight A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if t

Ana Carol Cortez 1 Sep 25, 2022
Dart HTTP server framework for building REST APIs. Includes PostgreSQL ORM and OAuth2 provider.

Aqueduct is a modern Dart HTTP server framework. The framework is composed of libraries for handling and routing HTTP requests, object-relational mapp

Stable Kernel 2.4k Jan 5, 2023
used REStful APIs to fetch reports of covid-19

covid_tracker A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Aun Abbas Ali 2 Oct 9, 2022
A Flutter plugin to use Chrome Custom Tabs.

Flutter Custom Tabs Plugin With the Flutter Custom Tabs Plugin, you can use Custom Tabs as easily as url_launcher. This plugin is built as federated p

Shinya Kumagai 118 Nov 18, 2022
A Flutter plugin to use Chrome Custom Tabs.

flutter_custom_tabs A Flutter plugin to use Chrome Custom Tabs. Custom Tabs is supported only Chrome for Android. For this reason, the interface is sa

Sarbagya Dhaubanjar 3 Mar 28, 2020
A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter

quick_usb A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter Usage List devices List devices with additional description Get device

Woodemi Co., Ltd 39 Oct 1, 2022
A Flutter plugin to read 🔖 metadata of 🎵 media files. Supports Windows, Linux & Android.

flutter_media_metadata A Flutter plugin to read metadata of media files. A part of Harmonoid open source project ?? Install Add in your pubspec.yaml.

Harmonoid 60 Dec 2, 2022
A Flutter plugin that supports Pangle SDK on Android and iOS.

Thanks for non-commercial open source development authorization by JetBrains. 穿山甲 Flutter SDK `pangle_flutter`是一款集成了字节跳动穿山甲 Android 和 iOS SDK的 Flutter

null 121 Dec 2, 2022
A Flutter plugin for handling Connectivity and REAL Connection state in the mobile, web and desktop platforms. Supports iOS, Android, Web, Windows, Linux and macOS.

cross_connectivity A Flutter plugin for handling Connectivity and REAL Connection state in the mobile, web and desktop platforms. Supports iOS, Androi

MarchDev Toolkit 29 Nov 15, 2022