Wie kann ich MediaStore auf Android aktualisieren?

Lesezeit: 7 Minuten

Dies begann als allgemeine Benutzerfrage in Android-Foren. Es ist jedoch zwangsläufig eine Programmierfrage geworden. Hier ist mein Problem.

Android hat einen Dienst – MediaScanner – der jedes Mal im Hintergrund läuft (glaube ich), dass die SD-Karte ausgehängt und wieder eingehängt wird. Dieser Dienst sammelt Daten zu allen Mediendateien auf der Karte und stellt eine SQLite-Datenbank bereit, die von Musikanwendungen abgefragt werden kann. Die meisten Musikanwendungen verwenden diesen Dienst, da er beim Scannen der SD-Karte Akkuverbrauch spart.

Seit ich Android verwende, habe ich ständig das Problem, dass mit dem Gerät synchronisierte M3U-Wiedergabelisten in dieser SQLite-DB verbleiben, auch nachdem sie von der SD-Karte gelöscht wurden. Es ist so weit gekommen, dass ich jetzt eine Sammlung von etwa 40 Wiedergabelisten habe, die in jeder von mir verwendeten Musik-App angezeigt werden, obwohl sich nur etwa 10 m3u-Dateien auf der Karte befinden. Die verbleibenden Wiedergabelisten werden nicht abgespielt und sind leer. Ich kann sie manuell entfernen, indem ich sie aus der Musik-App lösche, aber ich habe es satt, dies zu tun. Es muss einen besseren Weg geben, diese Geister-Wiedergabelisten zu entfernen.

Es gibt zwei Apps im Android Market – SDRescan und Music Scanner, die angeblich genau das tun, aber keine von beiden funktioniert.

Ich habe mich daran gemacht, meine eigene App zu schreiben, um die MediaStore-Datenbank zu aktualisieren oder zu löschen und von vorne anzufangen, aber ich komme nicht sehr weit. Ich habe eine Android-App, die den folgenden Code ausführt:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
        Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

Ich habe einige Beispiele für diesen Code online gefunden, um die SD-Karte zu scannen, aber ich habe überhaupt kein Glück damit. Irgendwelche Tipps?

VOLLSTÄNDIGER CODE:

package com.roryok.MediaRescan;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;

public class MediaRescan extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
        setContentView(R.layout.main);
    }

    //Rescan the sdcard after copy the file
    private void rescanSdcard() throws Exception{     
      Intent scanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                Uri.parse("file://" + Environment.getExternalStorageDirectory()));   
      IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
      intentFilter.addDataScheme("file");     
      sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                Uri.parse("file://" + Environment.getExternalStorageDirectory())));    
    }
}

  • Hallo, wissen Sie, ob sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(“file://” + Environment.getExternalStorageDirectory()))); Funktioniert für SD-Karten, die zusätzliche Steckplatzkarten sind? Mit anderen Worten, getExternalStorageDirectory() gibt einen Pfad zur SD-Karte zurück, die intern ist, aber es kann eine vom Hersteller bereitgestellte externe Karte geben? Wie kann der Medienscanner für solche Karten aufgerufen werden?

    – Ahmed

    26. Januar 2013 um 20:54 Uhr

  • derzeit scheint es keine Möglichkeit zu geben, dies zu tun. siehe diesen Thread: stackoverflow.com/questions/5453708/…

    – Roryok

    28. Januar 2013 um 10:30 Uhr

Wie kann ich MediaStore auf Android aktualisieren
Paskal

Hier ist eine einfach zu bedienende ‘einzelne Datei basiert‘ Lösung:

Datei hinzufügen:

Wann immer du addieren eine Datei, informieren MediaStore‘S Inhalt Anbieter mit:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(newMediaFile)));

Löschen einer Datei:

Ebenso, wenn Sie löschen eine Datei, informieren MediaStore‘S Inhalt Anbieter mit:

getContentResolver().delete(uri, null, null)  // (Credit goes to [DDSports][1])

  • Vermutlich ist dies als Lösung für das Problem verwaister Dateien gedacht, die überhaupt erst auftauchen. Meine App sollte das Chaos aufräumen, das hinterlassen wurde andere Apps, die dies NICHT tun

    – Roryok

    13. Februar 2013 um 12:24 Uhr

  • Ich habe dies positiv bewertet, da es zwar nicht genau das genannte Problem löst, aber eine sehr wertvolle Information ist, die ich für relevant halte.

    – Matt

    23. Dezember 2013 um 19:11 Uhr

  • Das funktioniert eigentlich nur beim Hinzufügen einer Datei. Es funktioniert nicht, wenn eine Datei gelöscht werden soll. Sie benötigen den getContentResolver().delete(uri, null, null); Methode dafür.

    – DDSports

    3. März 2014 um 14:47 Uhr

  • Eine bereits beobachtete „Neuerstellung“ einer leeren Datei, wenn der MediaStore nach dem Löschen der Datei benachrichtigt wird: Also, JA, getContentResolver().delete(uri, null, null) ist nützlich. Danke

    – Paskal

    4. März 2014 um 10:41 Uhr

  • ACTION_MEDIA_SCANNER_SCAN_FILE ist veraltet. Stattdessen können Sie sich auf diese Antwort beziehen: stackoverflow.com/a/63413716/1968839

    – thetaprim

    5. Februar 2021 um 8:01 Uhr

1646314987 366 Wie kann ich MediaStore auf Android aktualisieren
Roryok

Okay, ich habe es getan.

Anstatt die Karte erneut zu scannen, durchläuft die App alle Wiedergabelisten im Mediastore und überprüft die Länge des Felds _data. Ich habe festgestellt, dass dieses Feld für alle Listen ohne zugeordnete M3U-Datei immer leer war. Dann ging es nur noch darum, den Quellcode für die ursprüngliche Android-Musik-App zu finden, die Löschmethode zu finden und damit alle Wiedergabelisten mit einer Länge von 0 zu löschen. Ich habe die App PlaylistPurge umbenannt (da sie nicht erneut scannt ‘ mehr) und poste den Code unten.

Ich werde das wahrscheinlich auch irgendwo veröffentlichen, entweder auf dem Markt oder auf meiner eigenen Seite, http://roryok.com

package com.roryok.PlaylistPurge;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.ContentUris;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;

public class PlaylistPurge extends ListActivity {

    private List<String> list = new ArrayList<String>();
    private final String [] STAR= {"*"};

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ListAdapter adapter = createAdapter();
        setListAdapter(adapter);
    }

    /**
     * Creates and returns a list adapter for the current list activity
     * @return
     */
    protected ListAdapter createAdapter()
    {
        // return play-lists
        Uri playlist_uri= MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;    
        Cursor cursor= managedQuery(playlist_uri, STAR, null,null,null);
        cursor.moveToFirst();
        for(int r= 0; r<cursor.getCount(); r++, cursor.moveToNext()){
            int i = cursor.getInt(0);
            int l = cursor.getString(1).length();
            if(l>0){
                // keep any playlists with a valid data field, and let me know
                list.add("Keeping : " + cursor.getString(2) + " : id(" + i + ")");
            }else{
                // delete any play-lists with a data length of '0'
                Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, i);
                getContentResolver().delete(uri, null, null);
                list.add("Deleted : " + cursor.getString(2) + " : id(" + i + ")");
            }
        }       
        cursor.close();
        // publish list of retained / deleted playlists
        ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);

        return adapter;
    }
}

AKTUALISIEREN:

Hier ist ein Link zu einem Beitrag in meinem Blog über die App http://roryok.com/blog/index.php/2010/07/23/clearing-out-deleted-playlists-in-android/

UPDATE 2: Dienstag, 9. April 2013

Ich habe durch diesen Beitrag viel Traffic auf meinem Blog bekommen und eine große Anzahl von E-Mails von Leuten, die mir dafür danken. Schön, dass es geholfen hat! Jeder potenzielle Benutzer sollte wissen, dass meine beschissene App derzeit abstürzt, sobald Sie sie ausführen, aber tatsächlich tut, was sie tun soll! Ich hatte immer vor, zurückzugehen und dieses Absturzverhalten zu beheben und es auf den Markt zu bringen, hoffentlich wird 2013 das Jahr, in dem ich das tue.

  • Wird dies die Wiedergabelisten löschen, die nicht gelöscht wurden, aber auch keine Songs enthalten?

    – Vinay W

    30. Juli 2013 um 8:16 Uhr

  • Hallo vinay. Nein, es werden nur Einträge für gelöschte Wiedergabelisten entfernt. Playlists mit 0 Einträgen sind nicht betroffen

    – Roryok

    30. Juli 2013 um 10:40 Uhr

  • Danke! Gute Lösung

    – Ajay Venugopal

    20. Februar 2017 um 10:58 Uhr

  • Wie werden neue Dateien hinzugefügt?

    – Ajay Venugopal

    23. Februar 2017 um 17:13 Uhr

Mit dem folgenden Code können Sie einen erneuten Scan bestimmter Dateien anfordern.

HINWEIS: Der übergebene MIME TYPE ist wichtig. Ich habe festgestellt, dass Änderungen an MP3-ID3-Tags in SQLite nicht richtig aktualisiert wurden, wenn ich “*/*” verwendete, aber die Verwendung von “audio/mp3” funktionierte

MediaScannerConnection.scanFile(
    context, 
    new String[]{ pathToFile1, pathToFile2 }, 
    new String[]{ "audio/mp3", "*/*" }, 
    new MediaScannerConnectionClient()
    {
        public void onMediaScannerConnected()
        {
        }
        public void onScanCompleted(String path, Uri uri)
        {
        }
    });

  • Sie müssen den Mime-Typ wirklich überhaupt nicht bestehen. Wenn die Datei richtig benannt ist (*.mp3, *.m4a usw.), bestimmt der Scanner den MIME-Typ anhand der Erweiterung. Also statt neuer String[] { Mime-Typen }, übergeben Sie einfach null.

    – Baron

    20. Dezember 2012 um 17:38 Uhr

  • Dies funktionierte für mich, um das Entfernen gelöschter und verschobener Dateien zu erkennen. In meinem Fall kommuniziere ich über MTP (Media Transfer Protocol) und ohne die Dateien erneut zu scannen, scheinen sie bis zum Neustart noch vorhanden zu sein usw.

    – egfconnor

    13. November 2014 um 18:36 Uhr

  • soweit ich weiß wird sich das noch nicht auswirken Wiedergabelisten die gelöschte Medien referenzieren, nur die Bibliotheksreferenzen

    – Roryok

    10. Juni 2015 um 8:07 Uhr

923970cookie-checkWie kann ich MediaStore auf Android aktualisieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy