使用Contentprovider实现跨进程调用,一直报错

第一个进程的MyContentProvider.Java

public class MyContentProvider extends ContentProvider { 
  public static final int person_dir=0;
  public static final int person_item=1; 
  public static final String AUTHORITY="com.app.provider"; 
  private static UriMatcher uriMatcher; 
  private MyDatabaseHelper dbHelper; 
  static {
    uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); 
    // if resource is AUTHORITY/person,back person_dir,
     // if resource is AUTHORITY/person/#,back person_item, 
    uriMatcher.addURI(AUTHORITY,"person",person_dir); 
    uriMatcher.addURI(AUTHORITY,"person/#",person_item); 
  } 
}

剩下的就是一些方法,在该程序内成功使用ContentResolve调用person表。

第一个进程的AndroidManifest.xml文件

        <provider
            android:name=".MyContentProvider"
            android:authorities="com.app.provider"
            android:permission="com.example.provider"
            android:readPermission="com.test_3"
            android:enabled="true"
            android:exported="true">

        </provider>

第二个进程的MainActivity.java文件

public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private Broaddynamic broaddynamic;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       Button btn_query=findViewById(R.id.button_query);
        btn_query.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri uri=Uri.parse("content://com.app.provider/person/");
                ContentResolver resolver=getContentResolver();
                Cursor cursor=resolver.query(uri,null,null,null,null);
                if (cursor!=null){
                    while (cursor.moveToNext()){
                        int age=cursor.getInt(cursor.getColumnIndex("age"));
                        int id=cursor.getInt(cursor.getColumnIndex("_id"));
                        String name=cursor.getString(cursor.getColumnIndex("name"));
                        Log.d("test2","id is "+id);
                        Log.d("test2","name is "+name);
                        Log.d("test2","age is"+age);
                    }
                    cursor.close();
                }
            }
        });

    }
}

第二个进程的Mainfest文件

    <uses-permission  android:name="com.app.provider"/>
    <uses-permission android:name="com.example.test"/>
    <uses-permission android:name="com.example.provider"/>

运行显示E/ActivityThread: Failed to find provider info for com.app.provider

你的cursor为空,空指针错误

从Android 11开始,需要在AndroidManifest.xml清单文件中加入query权限申请,才能检测到手机上安装的三方应用包安装状态

因此需要在你的AndroidManifest.xml里面添加如下代码(在manifest里,在application外),注意authorities用你自己的authorities替换。
我的问题是这样解决的,仅供参考

    <queries>
        <provider android:authorities="com.example.myapplication" />
    </queries>