Android 12. Не удалось установить приложение. Несуществующая группа android.permission-group.MESSAGESAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android 12. Не удалось установить приложение. Несуществующая группа android.permission-group.MESSAGES

Сообщение Anonymous »

Ранее я тестировал приложение на устройствах под управлением Android 8, 10, 11, и оно работало нормально.Скомпилировано как TargetVersion 34.
Я только что попробовал скомпилировать приложение на устройство под управлением Android 12, и оно не будет установлено. Я вижу следующее сообщение ;
Installation failed due to: 'Failed to commit install session 558053483 with command cmd package install-commit 558053483. Error: -127: Package com.xxxxx.xxxxx.free.debug attempting to declare permission com.xxxxx.xxxxx.free.debug.permission.DELETE_MESSAGES in non-existing group android.permission-group.MESSAGES'

Я также пытался создать его как Release, но получаю то же сообщение.
Код манифеста выглядит следующим образом:

android:name="${applicationId}.permission.DELETE_MESSAGES"
android:description="@string/delete_messages_desc"
android:label="@string/delete_messages_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous"/>




Поискивал, но не могу понять, как с этим справиться.
Спасибо
< b>ОБНОВЛЕНИЕ

Код приведен ниже. Не знаю, сколько именно включить, так что это может быть излишним, извините, если так.
public class MessageProvider extends ContentProvider {
public static String AUTHORITY = BuildConfig.APPLICATION_ID + ".messageprovider";
public static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

private static final String[] DEFAULT_MESSAGE_PROJECTION = new String[] {
MessageColumns._ID,
MessageColumns.SEND_DATE,
MessageColumns.SENDER,
MessageColumns.SUBJECT,
MessageColumns.PREVIEW,
MessageColumns.ACCOUNT,
MessageColumns.URI,
MessageColumns.DELETE_URI,
MessageColumns.SENDER_ADDRESS
};
private static final String[] DEFAULT_ACCOUNT_PROJECTION = new String[] {
AccountColumns.ACCOUNT_NUMBER,
AccountColumns.ACCOUNT_NAME,
};
private static final String[] UNREAD_PROJECTION = new String[] {
UnreadColumns.ACCOUNT_NAME,
UnreadColumns.UNREAD
};

private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private List queryHandlers = new ArrayList();

/**
* How many simultaneous cursors we can afford to expose at once
*/
Semaphore semaphore = new Semaphore(1);

ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(1);

@Override
public boolean onCreate() {
registerQueryHandler(new ThrottlingQueryHandler(new AccountsQueryHandler()));
registerQueryHandler(new ThrottlingQueryHandler(new MessagesQueryHandler()));
registerQueryHandler(new ThrottlingQueryHandler(new UnreadQueryHandler()));

return true;
}

public static void init() {
Timber.v("Registering content resolver notifier");

final Context context = DI.get(Context.class);
MessagingController messagingController = DI.get(MessagingController.class);
messagingController.addListener(new SimpleMessagingListener() {
@Override
public void folderStatusChanged(Account account, String folderServerId, int unreadMessageCount) {
context.getContentResolver().notifyChange(CONTENT_URI, null);
}
});
}

@Override
public String getType(Uri uri) {
Timber.v("MessageProvider/getType: %s", uri);

return null;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Timber.v("MessageProvider/query: %s", uri);

int code = uriMatcher.match(uri);
if (code == -1) {
throw new IllegalStateException("Unrecognized URI: " + uri);
}

Cursor cursor;
try {
QueryHandler handler = queryHandlers.get(code);
cursor = handler.query(uri, projection, selection, selectionArgs, sortOrder);
} catch (Exception e) {
Timber.e(e, "Unable to execute query for URI: %s", uri);
return null;
}

return cursor;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {

Timber.v("MessageProvider/delete: %s", uri);

// Note: can only delete a message

List segments = uri.getPathSegments();
int accountId = Integer.parseInt(segments.get(1));
String folderServerId = segments.get(2);
String msgUid = segments.get(3);

// get account
Account myAccount = null;
for (Account account : Preferences.getPreferences(getContext()).getAccounts()) {
if (account.getAccountNumber() == accountId) {
myAccount = account;
if (!account.isAvailable(getContext())) {
Timber.w("not deleting messages because account is unavailable at the moment");
return 0;
}
}
}

if (myAccount == null) {
Timber.e("Could not find account with id %d", accountId);
}

if (myAccount != null) {
MessageReference messageReference = new MessageReference(myAccount.getUuid(), folderServerId, msgUid, null);
MessagingController controller = MessagingController.getInstance(getContext());
controller.deleteMessage(messageReference, null);
}

// FIXME return the actual number of deleted messages
return 0;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
Timber.v("MessageProvider/insert: %s", uri);

return null;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Timber.v("MessageProvider/update: %s", uri);

// TBD

return 0;
}

/**
* Register a {@link QueryHandler} to handle a certain {@link Uri} for
* {@link #query(Uri, String[], String, String[], String)}
*/
protected void registerQueryHandler(QueryHandler handler) {
if (queryHandlers.contains(handler)) {
return;
}
queryHandlers.add(handler);

int code = queryHandlers.indexOf(handler);
uriMatcher.addURI(AUTHORITY, handler.getPath(), code);
}

public static class ReverseDateComparator implements Comparator {
@Override
public int compare(MessageInfoHolder object2, MessageInfoHolder object1) {
if (object1.compareDate == null) {
return (object2.compareDate == null ? 0 : 1);
} else if (object2.compareDate == null) {
return -1;
} else {
return object1.compareDate.compareTo(object2.compareDate);
}
}
}

protected interface QueryHandler {
/**
* The path this instance is able to respond to.
*/
String getPath();

Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
throws Exception;
}

/**
* Extracts a value from an object.
*/
public interface FieldExtractor {
K getField(T source);
}

public static class DeleteUriExtractor implements FieldExtractor {
@Override
public String getField(MessageInfoHolder source) {
LocalMessage message = source.message;
int accountNumber = message.getAccount().getAccountNumber();
return CONTENT_URI.buildUpon()
.appendPath("delete_message")
.appendPath(Integer.toString(accountNumber))
.appendPath(message.getFolder().getServerId())
.appendPath(message.getUid())
.build()
.toString();
}
}


Подробнее здесь: https://stackoverflow.com/questions/783 ... roid-permi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»