8

Sto cercando di utilizzare Android Browser.BOOKMARKS_URI ai preferiti dispositivo CRUD da dentro il mio app (https://play.google.com/store/apps/details?id=com.elementique.web)Android Browser.BOOKMARKS_URI non funziona su tutti i dispositivi. Come scoprire l'uri corretto per un determinato dispositivo?

Sta lavorando bene sulla maggior parte dei dispositivi, ma non funziona su alcuni :-(

Su quelli dispositivi, cercando di utilizzare i segnalibri porta a

java.lang.IllegalArgumentException: Unknown URL content://browser/bookmarks 

ho capito che Boookmark Uri può essere diverso dal valore predefinito AOSP. (vale a dire "contenuto: // navigatore/segnalibri")

Domanda:

Come posso ottenere la corretta Bookmark Uri per un dato dispositivo?

ho gia 'raccolto' il seguente URI

private static final Uri BOKKMARKS_DEFAULT = Browser.BOOKMARKS_URI; // = Uri.parse("content://browser/bookmarks") 
private static final Uri BOKKMARKS_URI_CHROME = Uri.parse("content://com.android.chrome.browser/bookmarks"); 
private static final Uri BOKKMARKS_URI_SAMSUNG_S_ = Uri.parse("content://com.sec.android.app.sbrowser.browser/bookmarks"); 

E 'un modo per 'lista' tutti i contenuti disponibili in notazione URI (tenore: // ...) su un dispositivo? Se sì, potrei elencarli e cercare l'occorrenza della stringa "/ bookmarks" e dare una prova con questo URI.

Nota:

Sono attualmente in fase di creazione di un meccanismo di fallback, se l'applicazione non è in grado di ottenere un 'lavoro' segnalibro URI (vale a dire il mio segnalibro DB da quando ho bisogno di una funzione segnalibro nella mia app)

risposta

4

C'è un modo per 'lista' tutti i contenuti disponibili in notazione URI (tenore: // ...) su un dispositivo?

C'è un opensource APP denominata "Helper Provider Contenuto" in Play Store che può elencare tutti disponibili content:// URI sul dispositivo. Esso utilizza PackageManager.GET_PROVIDER

Ecco la rispettiva classe che cerca contenuti tutti disponibili fornitore:

SearchProviderTask.java

package com.jensdriller.contentproviderhelper.task; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 
import java.util.Locale; 
import android.content.Context; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.ProviderInfo; 
import android.net.Uri; 

public class SearchProvidersTask extends DialogAsyncTask<Uri, Void, List<String>> { 
    public SearchProvidersTask(Context context) { 
     super(context); 
    } 

    @Override 
    protected List<String> doInBackground(Uri... params) { 
     List<String> contentProviders = new ArrayList<String>(); 

     try { 
      PackageManager pm = mContext.getPackageManager(); 
      for (PackageInfo pack : pm.getInstalledPackages(PackageManager.GET_PROVIDERS)) { 
       ProviderInfo[] providers = pack.providers; 
       if (providers != null) { 
        for (ProviderInfo provider : providers) { 
         contentProviders.add("content://" + provider.authority); 
        } 
       } 
      } 
     } catch (Exception e) { 
      // PackageManager has died? 
      mException = e; 
     } 

     // Sort alphabetically and ignore case sensitivity 
     Collections.sort(contentProviders, new Comparator<String>() { 
      @Override 
      public int compare(String lhs, String rhs) { 
       return lowerCase(lhs).compareTo(lowerCase(rhs)); 
      } 

      private String lowerCase(String s) { 
       return s.toLowerCase(Locale.getDefault()); 
      } 
     }); 
     return contentProviders; 
    } 
} 

Github: https://github.com/jenzz/ContentProviderHelper

+0

Grazie! Sembra essere quasi quello che sto cercando. Dovrò solo essere in grado di filtrare contentProvider per mantenere il segnalibro. Non penso che possiamo fare di meglio, quindi, dal mio punto di vista, è la risposta giusta. Grazie :-) – Pascal

+0

Speriamo che ti possa aiutare. E se sei riuscito a raccogliere più URI del browser, per favore condividi pure ;-) farà sicuramente risparmiare tempo a tutti noi. –

0

Questa è la query per cercare i segnalibri;

cursor = mContentResolver.query(Browser.BOOKMARKS_URI, BOOKMARKS_PROJECTION, 
       Browser.BookmarkColumns.BOOKMARK + " == 1" + 
        " AND LOWER(" + Browser.BookmarkColumns.TITLE + ") LIKE ?", 
       new String[] { searchText + "%" }, 
       Browser.BookmarkColumns.TITLE + " ASC"); 
+3

la domanda è "come trovare la corretta uri per un dato dispositivo? " – Pascal