8

Tôi cố gắng để sử dụng Android Browser.BOOKMARKS_URI vào bookmark thiết bị CRUD từ bên trong ứng dụng của tôi (https://play.google.com/store/apps/details?id=com.elementique.web)Trình duyệt Android.BOOKMARKS_URI không hoạt động trên tất cả các thiết bị. Làm thế nào để tìm ra uri chính xác cho một thiết bị nhất định?

Đó là làm việc tốt trên hầu hết các thiết bị, nhưng không hoạt động trên một số :-(

Trên những thiết bị, cố gắng sử dụng bookmark dẫn đến

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

bây giờ tôi hiểu rằng Boookmark Uri có thể khác với giá trị mặc định AOSP. (tức là "nội dung: // duyệt/bookmarks")

Câu hỏi:

Làm cách nào để có được đúng Dấu trang Uri cho một thiết bị cụ thể?

Tôi đã 'thu thập' URI sau

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"); 

Có một cách để 'danh sách' tất cả các nội dung có sẵn URI (nội dung: // ...) trên một thiết bị? Nếu có, tôi có thể liệt kê chúng và tìm kiếm sự xuất hiện của chuỗi "/ bookmarks" và thử với URI này.

Note:

Tôi hiện đang trong quá trình tạo ra một cơ chế dự phòng nếu ứng dụng không có khả năng để có được một dấu 'làm việc' URI (ví dụ riêng Bookmark DB của tôi kể từ khi tôi cần một tính năng bookmark trong ứng dụng của tôi)

Trả lời

4

Có cách nào để 'danh sách' tất cả các nội dung có sẵn URI (nội dung: // ...) trên một thiết bị?

Có một mã nguồn mở APP gọi là "Content Provider Helper" trong Play Store có thể liệt kê tất cả có sẵn content:// URI trên thiết bị. Nó sử dụng PackageManager.GET_PROVIDER

Đây là lớp tương ứng để tìm kiếm tất cả có sẵn cung cấp nội dung:

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

Cảm ơn! Có vẻ như gần như những gì tôi đang tìm kiếm. Tôi sẽ chỉ có thể lọc contentProvider để giữ dấu trang. Tôi không nghĩ chúng ta có thể làm tốt hơn thế, vì vậy, theo quan điểm của tôi, đó là câu trả lời đúng. Cảm ơn :-) – Pascal

+0

Hy vọng nó sẽ giúp bạn. Và nếu bạn quản lý để thu thập thêm URI trình duyệt, xin vui lòng chia sẻ là tốt ;-) nó chắc chắn sẽ tiết kiệm thời gian cho tất cả chúng ta. –

0

Đây là truy vấn để tìm kiếm dấu trang;

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

Câu hỏi đặt ra là "Làm thế nào để tìm ra đúng uri cho một thiết bị cụ thể? " – Pascal

Các vấn đề liên quan