KitKat ACTION_OPEN_DOCUMENT не показывает документы на устройствах Samsung

Я использую новую среду доступа к хранилищу Kitkat (SAF), как указано здесь: https://developer.android.com/guide/topics/providers/document-provider.html

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, 0);

Это то же самое, что и пример кода, но фильтр изображений не работает. Ничего не появляется на S5 или Note3. То же самое происходит с видео (видео /*). Я также пробовал разные шаблоны, такие как / безрезультатно.

Это похоже на проблему Samsung, которую они должны решить, мне просто интересно, если кто-нибудь знает обходной путь.

2 ответа

Решение

У меня было то же самое на моем Galaxy S4, и единственный найденный мной обходной путь - это повторное использование старого способа:

Intent photoPickerIntent = new Intent();    
photoPickerIntent.setAction(Intent.ACTION_GET_CONTENT);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 0);

Но я полагаю, вы сначала хотите быть уверены, что находитесь на определенном устройстве, так как оно хорошо работает с Intent.ACTION_OPEN_DOCUMENT на других устройствах... (Я пробовал на Wiko Cink Slim и Nexus 5, с Android 4.4.2).

Надеюсь, это поможет вам

Я столкнулся с той же проблемой на Samsung Galaxy S4. Во время моего исследования я выяснил, что galaxy s4 не поддерживает провайдера медиа-документов. Решил это, запросив интерфейс медиа-провайдера. Вот что я сделал:

private void launchGallery()
{
    final Intent intent = new Intent();
    // Api 19 and above should access the Storage Access Framework
    if ( isMediaProviderPresent())
        intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
    else
        intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // Multi Picking is supported on api 18 and above.
    if (isApi18Above())
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

    startActivityForResult(Intent.createChooser(intent,"chooser"),
        RESULT_PHOTO_FROM_GALLERY);
}


private boolean isMediaProviderSupported()
{
    if(isApi19Above())
    {
        final PackageManager pm = getActivity().getPackageManager();
        // Pick up provider with action string
        final Intent i = new Intent(DocumentsContract.PROVIDER_INTERFACE);
        final List<ResolveInfo> providers = pm.queryIntentContentProviders(i, 0);
        for (ResolveInfo info : providers)
        {
            if(info != null && info.providerInfo != null)
            {
                final String authority = info.providerInfo.authority;
                if(isMediaDocumentProvider(Uri.parse("content://"+authority)))
                    return true;
            }
        }
    }
    return false;
}

  private static boolean isMediaDocumentProvider(final Uri uri)
    {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
Другие вопросы по тегам