2015-07-25 6 views
5

У меня есть поставщик контента для экспорта, который распространяется среди нескольких моих приложений, и для которого сторонняя организация может свободно писать свои собственные приложения после публикации API.Принудительные права на право собственности на контент-провайдера

В настоящее время любое клиентское приложение может выполнять любую операцию CRUD по любому элементу поставщика контента. Я хочу использовать некоторые разрешения доступа, чтобы приложение могло изменять или удалять только те элементы, которые оно создало, но при этом позволяя любому приложению читать все элементы в провайдере и создавать новые элементы.

Есть ли способ получить доступ к UID вызывающего приложения и сохранить его с вновь созданными элементами, а затем сравнить с этим значением для будущих операций? Было бы лучше использовать имя пакета? Я предполагаю, что UID может измениться, если пользователь удалил и переустановил приложение, и я не хочу, чтобы они потеряли доступ к этим элементам, если они это сделают.

ответ

1

Да, вы можете проверить имя пакета. Вот как вы можете получить имя пакета на основе вызывающего UID:

private static Collection<String> getCallingPackages(Context context) { 
    int callingUid = Binder.getCallingUid(); 
    if (callingUid == 0) { 
     return Collections.emptyList(); 
    } 

    String[] packages = context.getPackageManager().getPackagesForUid(callingUid); 
    return new ArrayList<>(Arrays.asList(packages)); 
} 

Это возвращает список имен пакетов, так как, по словам документации:

В большинстве случаев, это будет один имя пакета, пакет, которому был присвоен этот идентификатор пользователя.

Если существует несколько пакетов, совместно использующих один и тот же идентификатор пользователя через механизм «sharedUserId» , все пакеты с этим идентификатором будут возвращены.

Смежные вопросы