2011-01-03 6 views
3

Ich möchte ein Lesezeichen im Android-Browser aus meiner eigenen Anwendung erstellen. Wie kann ich das machen?Browser-Lesezeichen aus App erstellen

Ich fand nur die Browser.saveBookmark -Methode (api-doc), aber dies zeigt ein neues Fenster, in dem der Benutzer die Daten ändern kann. Da ich Lesezeichen aus einer externen Datenquelle importieren möchte, möchte ich das Lesezeichen direkt speichern und den Benutzer nicht zur Eingabe auffordern.

Antwort

4

Wenn Sie nur zulassen möchten, dass der Benutzer ein Lesezeichen hinzufügen, android.provider.Browser .saveBookmark() ist was Sie wollen. Aber es sieht so aus, als ob Sie Massenupdates machen wollen, das ist wahrscheinlich nicht genug, da es nur die Lesezeichen-Seite des Browsers öffnet.

AFAIK gibt es keine offene API, die direkt in die Lesezeichen des Browsers bindet. Dafür gibt es jedoch einen Content-Resolver, auf den android.provider.Browser.BOOKMARKS_URI zugreifen kann. Sobald Sie den Anbieter aufgelöst haben, können Sie Lesezeichen bearbeiten, indem Sie Abfragen ausführen, sofern Sie über die Berechtigungen com.android.browser.permission.READ_HISTORY_BOOKMARKS und com.android.browser.permission.WRITE_HISTORY_BOOKMARKS verfügen.

Wenn Sie mit Inhaltsanbietern nicht vertraut sind, können sie etwas haarig werden (doppelt, wenn Sie mit SQL nicht vertraut sind). Jedoch, the knowledge base hat einige gute Artikel auf ihnen, und eine schnelle Google für "Android Content Provider Tutorial" sollte Sie auf Ihrem Weg.

+0

Auch der Code für den Browser selbst hier gelesen werden kann: http: //android.git. kernel.org/?p=platform/packages/apps/Browser.git;a=log;h=refs/tags/android-cts-2.2_r4. Ich empfehle jedem, der eine ernsthafte Android-Arbeit machen möchte, durch den OS-Code nach den Dingen zu suchen, mit denen er interagieren wird. –

+0

Könntest du mir bitte dabei helfen? http://stackoverflow.com/questions/13725192/how-can-i-get-set-bookmarks-per-account-on-android – Pascal

+0

Welche Hilfe benötigen Sie speziell? Hast du die Links überprüft? –

2

Ich habe den folgenden Code aus Android-Implementierung (und deaktiviert die "Lesezeichen hinzugefügt" Toast):

/** 
* Add a bookmark to the database. 
* 
* @param context 
*   Context of the calling Activity. This is used to make Toast confirming that the bookmark has been added. If the caller provides null, the Toast will not be shown. 
* @param cr 
*   The ContentResolver being used to add the bookmark to the db. 
* @param url 
*   URL of the website to be bookmarked. 
* @param name 
*   Provided name for the bookmark. 
* @param thumbnail 
*   A thumbnail for the bookmark. 
* @param retainIcon 
*   Whether to retain the page's icon in the icon database. This will usually be <code>true</code> except when bookmarks are added by a settings restore agent. 
*/ 
static void addBookmark(Context context, ContentResolver cr, String url, String name, Bitmap thumbnail, boolean retainIcon) { 

    final String WHERE_CLAUSE = "url = ? OR url = ? OR url = ? OR url = ?"; 
    final String WHERE_CLAUSE_SECURE = "url = ? OR url = ?"; 
    String[] SELECTION_ARGS; 

    // Want to append to the beginning of the list 
    long creationTime = new Date().getTime(); 
    // First we check to see if the user has already visited this 
    // site. They may have bookmarked it in a different way from 
    // how it's stored in the database, so allow different combos 
    // to map to the same url. 
    boolean secure = false; 
    String compareString = url; 
    if (compareString.startsWith("http://")) { 
     compareString = compareString.substring(7); 
    } else if (compareString.startsWith("https://")) { 
     compareString = compareString.substring(8); 
     secure = true; 
    } 
    if (compareString.startsWith("www.")) { 
     compareString = compareString.substring(4); 
    } 
    if (secure) { 
     SELECTION_ARGS = new String[2]; 
     SELECTION_ARGS[0] = "https://" + compareString; 
     SELECTION_ARGS[1] = "https://www." + compareString; 
    } else { 
     SELECTION_ARGS = new String[4]; 
     SELECTION_ARGS[0] = compareString; 
     SELECTION_ARGS[1] = "www." + compareString; 
     SELECTION_ARGS[2] = "http://" + compareString; 
     SELECTION_ARGS[3] = "http://" + SELECTION_ARGS[1]; 
    } 
    Cursor cursor = cr.query(Browser.BOOKMARKS_URI, Browser.HISTORY_PROJECTION, secure ? WHERE_CLAUSE_SECURE : WHERE_CLAUSE, SELECTION_ARGS, null); 
    ContentValues map = new ContentValues(); 
    if (cursor.moveToFirst() && cursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) == 0) { 
     // This means we have been to this site but not bookmarked 
     // it, so convert the history item to a bookmark 
     map.put(Browser.BookmarkColumns.CREATED, creationTime); 
     map.put(Browser.BookmarkColumns.TITLE, name); 
     map.put(Browser.BookmarkColumns.BOOKMARK, 1); 
     // map.put(Browser.BookmarkColumns.THUMBNAIL, bitmapToBytes(thumbnail)); 
     cr.update(Browser.BOOKMARKS_URI, map, "_id = " + cursor.getInt(0), null); 
    } else { 
     int count = cursor.getCount(); 
     boolean matchedTitle = false; 
     for (int i = 0; i < count; i++) { 
      // One or more bookmarks already exist for this site. 
      // Check the names of each 
      cursor.moveToPosition(i); 
      if (cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX).equals(name)) { 
       // The old bookmark has the same name. 
       // Update its creation time. 
       map.put(Browser.BookmarkColumns.CREATED, creationTime); 
       cr.update(Browser.BOOKMARKS_URI, map, "_id = " + cursor.getInt(0), null); 
       matchedTitle = true; 
       break; 
      } 
     } 
     if (!matchedTitle) { 
      // Adding a bookmark for a site the user has visited, 
      // or a new bookmark (with a different name) for a site 
      // the user has visited 
      map.put(Browser.BookmarkColumns.TITLE, name); 
      map.put(Browser.BookmarkColumns.URL, url); 
      map.put(Browser.BookmarkColumns.CREATED, creationTime); 
      map.put(Browser.BookmarkColumns.BOOKMARK, 1); 
      map.put(Browser.BookmarkColumns.DATE, 0); 
      // map.put(Browser.BookmarkColumns.THUMBNAIL, bitmapToBytes(thumbnail)); 
      int visits = 0; 
      if (count > 0) { 
       // The user has already bookmarked, and possibly 
       // visited this site. However, they are creating 
       // a new bookmark with the same url but a different 
       // name. The new bookmark should have the same 
       // number of visits as the already created bookmark. 
       visits = cursor.getInt(Browser.HISTORY_PROJECTION_VISITS_INDEX); 
      } 
      // Bookmark starts with 3 extra visits so that it will 
      // bubble up in the most visited and goto search box 
      map.put(Browser.BookmarkColumns.VISITS, visits + 3); 
      cr.insert(Browser.BOOKMARKS_URI, map); 
     } 
    } 
    if (retainIcon) { 
     WebIconDatabase.getInstance().retainIconForPageUrl(url); 
    } 
    cursor.close(); 

}