Не удается разрешить com.android.camera.action.CROP в Android 11 при первой установке приложения

Я начинаю неявное намерение для обрезки со строкой com.android.camera.action.CROP на Android 11. когда приложение впервые установлено, оно не может разрешить свою активность с помощью этого кода.

   Intent intent = new Intent("com.android.camera.action.CROP");


    intent.setType("image/*");

    //to check whether there is an cropping app present or not
    List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(
            intent, MATCH_DEFAULT_ONLY);

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


person Taha alam    schedule 28.10.2020    source источник


Ответы (2)


Я предполагаю, что вы ориентируетесь на Android 11 (API 30), что требует от вас указать все намерения для внешних приложений в узле queries внутри вашего AndroidManifest.xml следующим образом:

<queries>
    ...
    <intent>
        <action android:name="com.android.camera.action.CROP" />
    </intent>
    ...
</queries>

Подробнее читайте здесь и здесь. Также есть пост на Medium по этому вопросу здесь.

ПРИМЕЧАНИЕ. Цель com.android.camera.action.CROP основана на приложении камеры от AOSP, которое может отсутствовать на некоторых устройствах. См. об этом старый пост в блоге Commonsware: https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html

person Zsolt Boldizsár    schedule 28.10.2020
comment
Это действительно странно. Не могли бы вы подтвердить, что у вас есть эти записи в вашем AndroidManifest? - person Zsolt Boldizsár; 28.10.2020
comment
targetSdkVersion — 30 - person Taha alam; 28.10.2020
comment
вставлен выше заданных строк, но проблема не устранена. - person Taha alam; 28.10.2020
comment
изменилось поведение: теперь обрезка не будет разрешена, пока приложение не откроет фотографии Google для просмотра галереи. - person Taha alam; 29.10.2020

В моем случае я использую следующую конфигурацию <queries> в AndroidManifest.xml, и она работает.

<manifest>
  // ...
  <queries>
      <intent>
          <action android:name="com.android.camera.action.CROP" />
          <data android:scheme="content"
            android:mimeType="image/*"/>
      </intent>
  </queries>
</manifest>

И resolveActivity:

    val intent = Intent("com.android.camera.action.CROP").apply {
        type = "image/*"
        data = photoUri
    }
    if (intent.resolveActivity(context.packageManager) != null) {
        // grant uri permission here
    }

После некоторого теста я обнаружил, что ключ в том, что android:mimeType в queries должен совпадать с type, который установлен в Intent.

person diousk    schedule 09.12.2020