Получить список mp3-файлов из папки с ресурсами и сохранить в общих настройках

У меня есть приложение, в котором у меня есть несколько звуков mp3 в папке с ресурсами. В начале приложения я получаю список файлов и копирую все файлы из активов в getExternalFilesDir(). Вызовите медиа-сканер для каждого файла, и только если медиа-сканер вернется с URI, напишите что-нибудь в общих настройках.

 private void copyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list("");
    } catch (IOException e) {
        Log.e("tag", "Failed to get asset file list.", e);
    }
    if (files != null) for (String filename : files) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(filename);
            File outFile = new File(getExternalFilesDir(null), filename);
            out = new FileOutputStream(outFile);
            copyFile(in, out);

            MediaScannerConnection.scanFile(this,
                    new String[] { outFile.getAbsolutePath() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String contentPath, Uri uri) {
                            Log.i("onScanCompleted", uri.toString());
                            RingtoneSoundChooserFragment.path = uri.toString();
                            SharedPreferences sharedPreferences = getSharedPreferences("songs_uri",Context.MODE_PRIVATE);
                            SharedPreferences.Editor editor = sharedPreferences.edit();
                            editor.putString(filename,uri.toString());
                            editor.apply();
                        }
                    });


        } catch(IOException e) {
            Log.e("tag", "Failed to copy asset file: " + filename, e);
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // NOOP
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // NOOP
                }
            }
        }
    }
}

Во фрагменте, где я хочу загрузить эти звуки и воспроизвести, я написал приведенный ниже код в своем классе фрагментов с именем «RingtoneSoundChooserFragment».

  List<SoundData> sounds = new ArrayList<>();
    SharedPreferences sharedPreferences = getContext().getSharedPreferences("songs_uri",Context.MODE_PRIVATE);


    sounds.add(new SoundData("Shukran", SoundData.TYPE_RINGTONE,sharedPreferences.getString("shukran.mp3","null")));
    sounds.add(new SoundData("My Shortcomings", SoundData.TYPE_RINGTONE,sharedPreferences.getString("my_shortcomings.mp3","null")));
    sounds.add(new SoundData("Need the Love", SoundData.TYPE_RINGTONE,sharedPreferences.getString("need_the_love.mp3","null")));
    sounds.add(new SoundData("La", SoundData.TYPE_RINGTONE,sharedPreferences.getString("la_ilaha_illallah.mp3","null")));
    sounds.add(new SoundData("ma", SoundData.TYPE_RINGTONE,sharedPreferences.getString("subhanallah.mp3","null")));
    sounds.add(new SoundData("Qal", SoundData.TYPE_RINGTONE,sharedPreferences.getString("baydh.mp3","null")));
    sounds.add(new SoundData("Be Yourself", SoundData.TYPE_RINGTONE,sharedPreferences.getString("be_yourself.mp3","null")));
    sounds.add(new SoundData("Jamal Ul-Wujoodi", SoundData.TYPE_RINGTONE,sharedPreferences.getString("jamal_ul_wujoodi.mp3","null")));
    sounds.add(new SoundData("Yan", SoundData.TYPE_RINGTONE,sharedPreferences.getString("ya.mp3","null")));
    sounds.add(new SoundData("Kun", SoundData.TYPE_RINGTONE,sharedPreferences.getString("kun.mp3","null")));
    sounds.add(new SoundData("Day", SoundData.TYPE_RINGTONE,sharedPreferences.getString("eid.mp3","null")));
    sounds.add(new SoundData("Sharab", SoundData.TYPE_RINGTONE,sharedPreferences.getString("sharab.mp3","null")));
    sounds.add(new SoundData("Ao", SoundData.TYPE_RINGTONE,sharedPreferences.getString("thirteen.mp3","null")));
    sounds.add(new SoundData("Hoyoo", SoundData.TYPE_RINGTONE,sharedPreferences.getString("hoyoo.mp3","null")));
    sounds.add(new SoundData("Yapo", SoundData.TYPE_RINGTONE,sharedPreferences.getString("fifteen.mp3","null")));
    sounds.add(new SoundData("mi", SoundData.TYPE_RINGTONE,sharedPreferences.getString("sixteen.mp3","null")));
    sounds.add(new SoundData("io", SoundData.TYPE_RINGTONE,sharedPreferences.getString("seventeen.mp3","null")));

    SoundsAdapter adapter = new SoundsAdapter(getAlarmio(), sounds);
    adapter.setListener(this);
    recyclerView.setAdapter(adapter);

У меня есть экран адаптера с кнопкой воспроизведения, и когда я хочу воспроизвести звук, я нажимаю на кнопку воспроизведения. Но проблема в том, что на некоторых устройствах Android звук звучит как "бип-бип-бип", а не фактический звук. однако на некоторых устройствах он остается полностью тихим, а на некоторых воспроизводит звук идеально. Проблема также в Android 10, но происходит на случайных устройствах. Некоторые воспроизводят звук идеально, а некоторые молчат или издают звуковой сигнал. Что мне не хватает или что не так с моим кодом? Пожалуйста, помогите


person Aarks    schedule 22.09.2020    source источник
comment
Вы сказали, что должно произойти. Но вы не сказали, если все происходит так, как вы хотите. Например, медиасканер дает вам uri для каждого файла?   -  person blackapps    schedule 22.09.2020
comment
На некоторых устройствах Android да, но на некоторых он не дает uri ни для одного файла. В этом проблема   -  person Aarks    schedule 22.09.2020
comment
Тем более в андроиде 10 медиасканер не выдает никаких uri   -  person Aarks    schedule 22.09.2020
comment
Mediascanner работает на некоторых устройствах, поэтому я не знаю, в этом ли проблема.   -  person Aarks    schedule 22.09.2020
comment
Вы знаете решение о том, как решить?   -  person Aarks    schedule 22.09.2020
comment
Извините, сэр, я новичок в этом, я обновлю пост   -  person Aarks    schedule 22.09.2020


Ответы (1)


Медиа-сканер не будет индексировать файлы в личном каталоге ваших приложений. Больше не из getExternalFilesDir().

Но вам не нужен медиа-сканер, чтобы получить uri или сохранить информацию в общих настройках.

Просто возьмите FileProvider для обслуживания ваших файлов.

Альтернативой является прямое копирование файлов в хранилище мультимедиа. Тогда у вас будет хороший медиа-магазин, и ваши файлы тоже будут отсканированы.

Третья возможность — взять свой собственный ContentProvider и обслуживать файлы напрямую из ресурсов. Не нужно сначала копировать.

person blackapps    schedule 22.09.2020
comment
Спасибо, позвольте мне попробовать это :) - person Aarks; 22.09.2020
comment
Не могли бы вы поделиться каким-либо примером для третьего варианта или любого варианта, который вы написали? Я новичок в поставщике файлов и поставщике контента. Любая вспомогательная ссылка будет полезна. Спасибо - person Aarks; 22.09.2020
comment
Спасибо. я попробую это - person Aarks; 22.09.2020
comment
Я думаю, вам лучше посмотреть здесь, так как первая ссылка не имеет исходного кода, насколько я вижу. Прочтите все комментарии. - person blackapps; 22.09.2020
comment
stackoverflow .com/questions/29477209/ - person blackapps; 22.09.2020