wonder_F 2021-07-01 16:41 采纳率: 0%
浏览 299

使用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

  • 写回答

2条回答 默认 最新

  • sweet_tr 2022-03-09 23:14
    关注

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

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

        <queries>
            <provider android:authorities="com.example.myapplication" />
        </queries>
    
    评论 编辑记录

报告相同问题?

悬赏问题

  • ¥15 Collection contains no element matching the predicate
  • ¥20 冻品电商平台的搜索是怎么实现的
  • ¥15 如何搞一个可以控制、显示马达频率
  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办