Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 15.04.2021
Сообщений: 4

URI полученное из SqLite не работает

11.05.2024, 02:27. Показов 861. Ответов 6

Студворк — интернет-сервис помощи студентам
Я пишу андроид приложение которое работает с аудиокнигами. Часто аудиокниги хранятся в папке где каждый айдио файл является главой. База данных используется SqLite, модель таблицы хранит ид книги, URI ее директории(папки), название, иконку и строку с главами. Вот тут самое интренсое, есть 2 варианта хранить главы, когда я получаю ури аудио файлов я чтобы не сортиовть по методанным сразу пишу ключ и ури, далее можно преобразовать мап в джейсон, а потом в строку или просто уже отсортированный мап переписать в массив и в качестве ключа ид юзать. Теперь о проблеме, когда я получаю строку с ури и чере урипарс преобразовываю ее в ури то это ссылка не работает, проверял ее подстановкой в файл и пытался получитть файл и проверить на его существование, пишет что его нет. Хотя я выводил ури через логи и смотрел какой ури я вытягиваю из бд они одинаковые. Я даже просто ури превращал в массив а потом в строку и нахад в ури то оно работало. Но делалось это сразу после того как я только его получил, при перезапуске приложения ссылка уже не работала. Как я понимаю ури не долговечно и после перезапуска приложения ури возможно меняются. Есть идеи как можно хранить ури в БД и быстро их доставать?
Моя БД
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  public DataBase (Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            String createTableQuery = "CREATE TABLE " + TABLE_NAME + " (" +
                    COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                    COLUMN_TITLE + " TEXT," +
                    COLUMN_IMAGE + " BLOB," +
                    DIRECTORY_URI + " TEXT," +
                    COLUMN_CHAPTERS + " TEXT)";
            String createTableQuery1 = "CREATE TABLE zx (" +
                    COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                    COLUMN_TITLE + " TEXT)";
            sqLiteDatabase.execSQL(createTableQuery);
            sqLiteDatabase.execSQL(createTableQuery1);
 
        }
 
 
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
 
        }
 
        public void insertAudioTrack(AudioTrack audioTrack) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(COLUMN_TITLE, audioTrack.title);
            values.put(COLUMN_IMAGE, audioTrack.image);
            values.put(DIRECTORY_URI, audioTrack.directory_uri);
            values.put(COLUMN_CHAPTERS, new Gson().toJson(audioTrack.chapters));
            db.insert(TABLE_NAME, null, values);
            db.close();
        }
 
    public void insertAudioTrack1(String audioTrack) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_TITLE, audioTrack);
        db.insert("zx", null, values);
        db.close();
    }
 
        public boolean isUriExists(String directoryUri) {
            SQLiteDatabase db = this.getReadableDatabase();
            String[] projection = {COLUMN_ID};
            String selection = DIRECTORY_URI + " = ?";
            String[] selectionArgs = {directoryUri};
 
            Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, null);
            int count = cursor.getCount();
            cursor.close();
            return count > 0;
        }
 
        public List<AudioTrack> getAllAudioTracks() {
            List<AudioTrack> audioTracks = new ArrayList<>();
            String selectQuery = "SELECT * FROM " + TABLE_NAME;
 
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db.rawQuery(selectQuery, null);
 
            if (cursor.moveToFirst()) {
                do {
                    @SuppressLint("Range") String title = cursor.getString(cursor.getColumnIndex(COLUMN_TITLE));
                    @SuppressLint("Range") byte[] image = cursor.getBlob(cursor.getColumnIndex(COLUMN_IMAGE));
                    @SuppressLint("Range") String directoryUri = cursor.getString(cursor.getColumnIndex(DIRECTORY_URI));
                    @SuppressLint("Range") String chaptersJson = cursor.getString(cursor.getColumnIndex(COLUMN_CHAPTERS));
                    String chapters = new Gson().fromJson(chaptersJson, String.class);
 
                    AudioTrack audioTrack = new AudioTrack(title, image, directoryUri, chaptersJson);
                    audioTracks.add(audioTrack);
                } while (cursor.moveToNext());
            }
            cursor.close();
            return audioTracks;
        }
 
    }
 
class AudioTrack {
    public String title;
    public byte[] image;
    public String directory_uri;
    public String chapters;
 
    public AudioTrack(String title, byte[] image, String directory_uri, String chapters) {
        this.title = title;
        this.image = image;
        this.directory_uri = directory_uri;
        this.chapters = chapters;
    }
}
метод получения папки и сохранение его в БД
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
   ImageButton addBook = findViewById(R.id.add_book);
        addBook.setOnClickListener(v -> {
            permission.setContext(this);
            permission.CallPermission();
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            startActivityForResult(intent, PICK_FILE_REQUEST_CODE);
        });
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        DataBase dataBase = new DataBase(this);
        String json;
        if (requestCode == PICK_FILE_REQUEST_CODE && resultCode == RESULT_OK && data != null) {
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            HashMap<Integer, Uri> arr = new HashMap<>();
            Uri singleUri = data.getData();
            DocumentFile pickedDir = DocumentFile.fromTreeUri(this, singleUri);
            ArrayList<Uri> array = new ArrayList<>();
            if (pickedDir != null && pickedDir.isDirectory()) {
                DocumentFile[] files = pickedDir.listFiles();
                if (!dataBase.isUriExists(pickedDir.getUri().toString())) {
                    for (DocumentFile file : files) {
                        retriever.setDataSource(this, file.getUri());
                        Log.i("FIRST URI", file.getUri().toString());
                        int trackNumber = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
                        arr.put(trackNumber, file.getUri());
                    }
 
                    //                    byte[] albumArt = retriever.getEmbeddedPicture();
 
                    for ( Map.Entry<Integer, Uri> file :  arr.entrySet()) {
                        array.add(file.getValue());
                    }
                    AudioTrack audioTrack = new AudioTrack(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM),
                            retriever.getEmbeddedPicture(),
                            pickedDir.getUri().toString(), array.toString());
                    Log.i("Uri", String.valueOf(array));
                    Log.i("Uri", String.valueOf(array.get(1)));
                    dataBase.insertAudioTrack(audioTrack);
                } else {
                    // просто лог
 
                }
            }
 
        }
    }
Потом в грид вью я хочу запускать книгу, вот его код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 @NonNull
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
 
        if(convertView==null){
            convertView = inflater.inflate(this.resource, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        final AudioTrack audioTrack = audioTracks.get(position);
        viewHolder.textView.setText(audioTrack.title);
        byte[] imageBytes = audioTrack.image;
        Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        viewHolder.imageView.setImageBitmap(bitmap);
 
        viewHolder.imageView.setOnClickListener(v -> {
            String jsonString = audioTrack.chapters;
            String x = audioTrack.chapters;
//            ArrayList<String> vv = new ArrayList<>(Arrays.asList(x.split(",")));
            Log.i("chapters", audioTrack.chapters);
            Log.i("directory_uri", audioTrack.directory_uri);
            Log.i("title", audioTrack.title);
 
            Uri uu = Uri.parse(audioTrack.directory_uri);
            File file = new File(uu.getEncodedPath());
            if (file.exists()) {
                Log.i("@@@@1", "11");
            } else {
                Log.i("@@@@1", "00");
            }
            ArrayList<String> array = new ArrayList<>(Arrays.asList(jsonString.split(",")));
            Log.i("Arr", array.toString());
            Uri uri = Uri.parse(array.get(1));
         
 
            SongActivity.getInfoFromManifest(uu,  context);
//            PlayPanelActivity.playMusic(uu,  context);
        });
 
        return convertView;
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2024, 02:27
Ответы с готовыми решениями:

Как правильно создать файл из Uri или Uri.getPath() для отправки на сервер?
Есть Uri, полученный после выбора файлов в галерее. Uri вроде правильный:...

Невозможно определить формат URI (Немецкие символы в URI)
Столкнулся с забавной проблемой при парсинге через HAP: &quot;Недопустимый URI: Невозможно определить формат URI.&quot; Сама ссылка ...

Недопустимый URI: Невозможно определить формат URI
Вылетает ошибка при использовании AUTOCAD LT &quot; Необрабатываемое исключение в компоненте приложения...&quot; Недопустимый URI:...

6
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
11.05.2024, 06:24
Цитата Сообщение от VARYAGIUS Посмотреть сообщение
Теперь о проблеме, когда я получаю строку с ури и чере урипарс преобразовываю ее в ури то это ссылка не работает, проверял ее подстановкой в файл и пытался получитть файл и проверить на его существование, пишет что его нет
А как у вас выглядит хранимое Uri? Возможно вы его сохраняете в неверном виде.
после 27 строки добавьте Log.i("@@@1",uu.toString());
И наверное, вместо getEncodedPath() лучше использовать getPath()
0
0 / 0 / 0
Регистрация: 15.04.2021
Сообщений: 4
11.05.2024, 18:18  [ТС]
Спасибо за ответ, я пробовал разные варианты, и даже был момент, что вроде бы получилось по ури из бд запустить файл, но после перезапуска приложения уже ури не работало. Я наткнуля на другом форуме на линк на такую документацию, думаю это мой случай
https://developer.android.com/... operations
Java
1
2
3
4
5
final int takeFlags = intent.getFlags()
            & (Intent.FLAG_GRANT_READ_URI_PERMISSION
            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(uri, takeFlags);
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
11.05.2024, 21:12
Цитата Сообщение от VARYAGIUS Посмотреть сообщение
документацию, думаю это мой случай
Совершенно не ваш. Вы контент резолвером не пользуетесь.
Еще раз, проверьте что оказалось в БД
0
0 / 0 / 0
Регистрация: 15.04.2021
Сообщений: 4
13.05.2024, 17:02  [ТС]
Я выводил логи только что полученого ури и потом то, что вытягиваю из бд, они одинаковые
0
93 / 65 / 29
Регистрация: 22.11.2019
Сообщений: 232
17.05.2024, 14:22
вытягивайте из Uri полный путь к файлу и храните в БД его
0
0 / 0 / 0
Регистрация: 15.04.2021
Сообщений: 4
20.05.2024, 14:37  [ТС]
Всем спасибо за помощь, проблема была в том, я брал полный ури (context//... итд). Но для получения вайла нужен внутрений путь /storage/emulated/0/Music/Chernoved.-Svezhaya-krov-Stanislav-Miller_1 (1)/57.mp3 также если данные хранятся на карте памяти или езе какомто хранилище то путь может быть такой с указанием ид хранилища вместо директории /storage/3454-3453/Chernoved.-Svezhaya-krov-Stanislav-Miller_1 (1)/57.mp3. Вот код как пожно распарсить ури из дериктории и сохранить их в массив в парвильном формате, потом эти пути будут работать в для конструкций типа File file = new File(path) или mediaPlayer.setDataSource(path) и все работает.
Java
1
2
3
4
5
6
7
8
9
10
11
                 for (DocumentFile file : files) {
                        String uri = file.getUri().getPathSegments().get(3);
                        retriever.setDataSource(this, file.getUri());
                        if (uri.contains("primary:")) {
                            uri = uri.replace("primary:", internalStorageRoot + "/");
                        } else {
                            String[] parts = uri.split(":");
                            uri = "/storage/" + parts[0] + "/" + parts[1];
                        }
                            list.add(new AudioItem(Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER)), uri));
                    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.05.2024, 14:37
Помогаю со студенческими работами здесь

Почему не работает Uri для локальных файлов
Подскажите, почему не работает: Web.Navigate(new Uri(&quot;file:///C:/Users/someuser/htmlfile.html&quot;)); В то время как это: ...

Создание Bitmap. Ошибка "Недопустимый URI: Невозможно определить формат URI."
Cоздаю класс,но при запуске выдает ошибку &quot;System.UriFormatException: &quot;Недопустимый URI: Невозможно определить формат URI.&quot; ...

Не работает оглавление в документе, полученное из Консультант плюс
Здравствуйте, ранее я с КОНСУЛЬТАНТ + http://www.consultant.ru/ качал файлы, например как этот, который прилагаю, вставлял вверху документа...

Php и sqlite Работает на денвере, не работает на хостинге
Здравствуйте. Подскажите в чем может быть проблема. Написан сайт специализированного словаря. База слов храниться с использование...

Uri и все об uri
Народ, можете объяснить для чего нужно uri Например что бы в CookieContainer добавить куку нужно uri Что и для чего объясните ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru