当前位置: 首页 > 知识库问答 >
问题:

权限拒绝:打开提供程序Android Studio

终彬郁
2023-03-14
public class DroneProvider extends ContentProvider {
    private static final String AUTHORITY = "com.x.x.adminapp";
    private static final String BASE_PATH = "Drone";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH );

    private static final int DRONE = 1;
    private static final int DRONE_NAME = 2;

    private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        uriMatcher.addURI(AUTHORITY,BASE_PATH, DRONE);
        uriMatcher.addURI(AUTHORITY,BASE_PATH + "/#",DRONE_NAME);
    }
@Nullable
@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
    Cursor cursor;
    switch (uriMatcher.match(uri)) {
        case DRONE:
            cursor =  database.query(MyDBHandler.TABLED_NAME,MyDBHandler.ALL_DRONE_COLUMNS,
                    s,null,null,null,MyDBHandler.COLUMN_DNAME +" ASC");
            break;
        default:
            throw new IllegalArgumentException("This is an Unknown URI " + uri);
    }
    cursor.setNotificationUri(getContext().getContentResolver(),uri);

    return cursor;
}
<provider
            android:name=".DroneProvider"
            android:authorities="com.x.x.adminapp"
            android:readPermission="com.x.x.adminapp.READ_DATABASE"
            android:writePermission="com.x.x.adminapp.WRITE_DATABASE"
            android:enabled="true"
            android:exported="true"></provider>
    private static final String AUTHORITY = "com.x.x.adminapp";
    private static final String BASE_PATH = "Drone";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH );

    private static final int DRONE = 1;
    private static final int DRONE_NAME = 2;

    private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        uriMatcher.addURI(AUTHORITY,BASE_PATH, DRONE);
        uriMatcher.addURI(AUTHORITY,BASE_PATH + "/#",DRONE_NAME);
    }
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

 ContentResolver contentResolver = getContext().getContentResolver();
                String sortOrder = "name ASC";
                Cursor cursor = contentResolver.query(CONTENT_URI,null,null,null,sortOrder);
                if (cursor!= null && cursor.getCount()>0){
                    cursor.moveToFirst();
                    Drone drone ;
                    Marker m;
                    LatLng latLng;
                    do {
                        drone = new Drone();
                        drone.setName(cursor.getString(0));
                        latLng = new LatLng(0.0,0.0);
                        m = googleMap.addMarker(new MarkerOptions().position(latLng).title(drone.getName()));
                        Drones.add(m);

                    }
                    while (cursor.moveToNext());
                }

并且我在App2清单中添加了权限:

<uses-permission android:name="com.x.x.adminapp.READ_DATABASE" />
<uses-permission android:name="com.x.x.adminapp.WRITE_DATABASE" />

但我得到了这个错误:

java.lang.SecurityException:拒绝权限:从ProcessRecord{46a1928 24678:com.x.x.myApplication11/U0a165}(PID=24678,UID=10165)打开提供程序com.x.x.adminapp.read_database或com.x.x.adminapp.write_database

提前感谢您的帮助:)

共有1个答案

柯曜文
2023-03-14

您需要定义任何自定义权限:

https://developer.android.com/guide/topics/permissions/defining.html

<permission
  android:name="com.x.x.adminapp.WRITE_DATABASE"
  android:label="Write Database"
  android:description="Write to my database."
  android:protectionLevel="normal" />

<permission
  android:name="com.x.x.adminapp.READ_DATABASE"
  android:label="Read Database"
  android:description="Read from my database."
  android:protectionLevel="normal" />

注意保护级别“正常”,这意味着任何应用程序都可以请求并被授予该权限。我建议你把它改成“签名”,这样只有你的应用程序才能被授予这个权限。同时,这两个应用程序需要用相同的密钥进行签名。:)

 类似资料:
  • 我已经创建了一个自定义内容提供者,它将被更多的应用程序访问。我已经在我的提供者AndroidManifest中包含了权限标记。xml文件,在第二个应用程序中,我包含了uses-permissions标记,但没有成功。Logcat向我展示: 我也搜索过类似的问题,但似乎一切都是正确的。有什么想法吗?谢谢 这是我的提供者AndroidManifest。xml文件: 这是我的第二个应用程序Android

  • java.lang.SecurityException:权限拒绝:从ProcessRecord{932688f 12849:mobi.hubbler.app/U0A158}(PID=12849,uid=10158)打开提供程序com.miui.gallery.provider.GalleryOpenProvider,而该提供程序不是从uid 10034导出的 试图从URI获取位图。这个问题只发生在

  • 我开始图像拾取器的意图使用: 在中,我获取所有选中图像的URI,启动在后台运行的作业并上传这些图像(https://github.com/yigit/android-priority-jobqueue)。但如果按下“后退”按钮并退出活动,则任何未启动的作业在运行并抛出异常时都无法访问选定的映像: java.lang.SecurityException:拒绝权限:从ProcessRecord{...

  • 我遇到了问题,我尝试在我的comsumer应用程序中实现内容提供程序: 这是我从App A(提供商)获得的Android清单: 这是我从App B(消费者)获得的Android清单: 应用程序A得我得提供商: process:com.erlanggakmoekasan.favoritemovies,pid:27146 java.lang.runtimeException:无法启动活动Compone

  • 我在尝试在Android emulator中执行应用程序升级时遇到了一些问题。该场景的流程来自一个活动,我将执行打开片段A的AsyncTask A,然后在AsyncTask A中,我将检查版本升级是否可用。 如果可用并且用户从片段A中选择了“OK”,我将转到AsyncTask B打开片段B,它向用户显示一条消息,说明正在进行升级。在AsyncTask B doInbackground()中,我将执

  • 我有两个app:app1和app2。 App2具有: paths.xml: App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作: 从App2接收回结果后,App1执行以下操作: 在App1中,从App2返回时,我得到以下异常: java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com