CWAC Stream¨Provider: плохой файл после совместного использования - слишком большой и недоступный - PullRequest
0 голосов
/ 17 января 2019

Я делюсь mp3-файлом с другим приложением от CWAC-провайдера. https://github.com/commonsguy/cwac-provider Этот файл делится на longClick. После лонгклика я получаю filepath из массива и вызываю метод для создания Intent для совместного использования. В этом намерении я вызываю функцию getUri для поиска моего файла. Все работает без ошибок, приложение показывает окно, чтобы выбрать целевое приложение. Но когда я выбираю Gmail, у меня появляется ошибка: максимальный размер файла составляет 20 МБ, Discord показывает только сообщение, но не файл, а Telegram - неподдерживаемое вложение. Я не знаю, где проблема. Этот поставщик не моя чашка чая, но я красный документация.

функция getUri

      private Uri getURI(){
    return(PROVIDER
            .buildUpon()
            .appendPath(StreamProvider.getUriPrefix(AUTHORITY))
            .appendEncodedPath(ASSET_PATHS)
            .build());
}

Эта функция возвращает:

    content://cz.revelio.tomiookamura/ea12dd4a-c098-4ce5-b191- 
   abab9d00b52f/assets/nase_hnuti_spd.mp3

У меня есть все мои mp3 в папке активов.

provider_paths.xml

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
    <asset name="asset" path=""/>
    </paths>

Установить onLongClick ()

     button.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        Bundle params = new Bundle();
                        params.putInt("ButtonId", v.getId());
                        String btnName = "share_"+soubor;
                        mFirebaseAnalytics.logEvent(btnName, params);
                        ASSET_PATHS =  "assets/"+soubor+".mp3";
                        Log.e("ERROR","Path:"+getURI());


                        return false;
                    }
                });

функция onShareFile

    private void onShareFile() {


   Intent shareIntent = new Intent();
   shareIntent.setAction(Intent.ACTION_SEND);
   shareIntent.putExtra(Intent.EXTRA_TEXT, "Poslechni si hlášku Tomia Okamury z aplikace Hlášky Tomia Okamury!");
   shareIntent.putExtra(Intent.EXTRA_STREAM, getURI());
   shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
   shareIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION );
   shareIntent.setType("audio/*");
   startActivity(Intent.createChooser(shareIntent, "Sdílet hlášku"));
  }

Поставщик в манифесте

    <provider
        android:name="com.commonsware.cwac.provider.StreamProvider"
        android:authorities="cz.revelio.tomiookamura"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="com.commonsware.cwac.provider.STREAM_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

определить переменные класса

private static final String AUTHORITY = "cz.revelio.tomiookamura";
private static final Uri PROVIDER = Uri.parse("content://"+AUTHORITY);
private static String ASSET_PATHS;

1 Ответ

0 голосов
/ 17 января 2019
ASSET_PATHS =  "assets/"+soubor+".mp3";

Здесь у вас есть путь как assets/.

<asset name="asset" path=""/>

Здесь у вас есть name как asset.

Они не совпадают, и они должны соответствовать.

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

...