a_dzik
a_dzik

Reputation: 977

Android browser history URI?

I need to save the last visited webpage by user. Evething works fine with my Galaxy S4 (5.0.1) with Chrome Browser.

However, on some phones I got nothing or very mixed results. From what I gathered, the biggest problem is with Browser URI itself. Some phones use Chrome as their main browser, some use something else.

I have three sources: content://com.android.chrome.browser/bookmarks content://com.sec.android.app.sbrowser/bookmarks Browser.BOOKMARKS_URI

So right now I'm working on something like this:

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        h.removeCallbacks(this);
        h.postDelayed(this, 500);
    }

    public void run() {

        String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL,Browser.BookmarkColumns.DATE };
        String selection = Browser.BookmarkColumns.BOOKMARK + " = 0"; // 0 = history, 1 = bookmark
        Cursor mCur = null;
        try {
            mCur = contentResolver.query(getURI(), proj, selection, null, null);
            if(mCur != null && mCur.moveToLast()){

                String title = "";
                String url = "";

                title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));
                url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));

                ...


            }

        } catch (Exception e){

                ...

        } finally {
            if(mCur != null)
                mCur.close();
        }
    }

    private Uri getURI(){
        Uri uri = Uri.parse("content://com.android.chrome.browser/bookmarks");
        return uri;
    }
  1. Whet is the best way to provide correct URI? onChange is triggered as content observer on browsers history.

So user can browse internet on Chrome and I still get history results from ASOP browser. When I observe chrome directly, on some phones I get failed to find provider info, because there is no chrome installed.

  1. What are other "popular" sources to search for browser history? I'd prefer to make this as bulletproof as possible.

Upvotes: 3

Views: 3492

Answers (1)

Elton da Costa
Elton da Costa

Reputation: 1277

try it: (run perfectly in android > 4.0 and 5 or 6.0 ); Anything, create a contentObserver array in FOREACH and add a list and record a different URI for each.

in service android (background):

HistoryObserver hObserver;

 public void onCreate() {
   hObserver = new HistoryObserver(new Handler(), this); 
   getApplicationContext().getContentResolver().registerContentObserver(Uri.parse("content://com.android.chrome.browser/history"), true, hObserver);
 }

Class historicObserver:

import java.text.SimpleDateFormat;
import java.util.Calendar;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.provider.Browser;
import android.util.Log;

public class HistoryObserver extends ContentObserver {

public final String TAG = "HistoryObserver";

Context context;

public HistoryObserver(Handler handler, Context c) {
    super(handler);
    Log.d(TAG, "Creating new HistoryObserver");
    context = c;
}

public HistoryObserver(Context c) {
    super(null);
    Log.d(TAG, "Creating a new HistoryObserver without a Handler");
    context = c;
}

@Override
public boolean deliverSelfNotifications() {
    Log.d(TAG, "delivering self notifications");
    return true;
}

@Override
public void onChange(boolean selfChange) {
    super.onChange(selfChange);
    Log.d(TAG, "onChange without uri: " + selfChange);
    // onChange(selfChange, null);
}

@SuppressLint("NewApi")
public void onChange(boolean selfChange, Uri uri) {
    super.onChange(selfChange, uri);


    Log.d(TAG, "onChange: " + selfChange + "\t " + uri.toString());

    String[] proj = new String[] { Browser.BookmarkColumns.TITLE,
            Browser.BookmarkColumns.URL, Browser.BookmarkColumns.DATE };
    String selection = Browser.BookmarkColumns.BOOKMARK + " = 0"; // 0 =
                                                                    // history,
                                                                    // 1 =
                                                                    // bookmark

    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Cursor mCursor = context.getContentResolver().query(Browser.BOOKMARKS_URI,
            proj, selection, null, null);
    // this.startManagingCursor(mCursor);
    mCursor.moveToFirst();
    int count = mCursor.getColumnCount();
    String COUNT = String.valueOf(count);
    Log.e("Browser sayac", COUNT);

    String title = "";
    String url = "";
    String date = "";
    if (mCursor.moveToFirst() && mCursor.getCount() > 0) {

        while (mCursor.isAfterLast() == false) {

            title = mCursor.getString(mCursor
                    .getColumnIndex(Browser.BookmarkColumns.TITLE));
            url = mCursor.getString(mCursor
                    .getColumnIndex(Browser.BookmarkColumns.URL));
            date = mCursor.getString(mCursor
                    .getColumnIndex(Browser.BookmarkColumns.DATE));
            Long timestamp = Long.parseLong(date);

            SimpleDateFormat dateFormat = new SimpleDateFormat(
                    "dd/MM/yyyy/HH:mm");
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(timestamp);
            String finaldate = dateFormat.format(calendar.getTime());
            String smsDate = finaldate.toString();

            // Log.e("DTE", date);
            Log.e("URL", title);

            Log.e("TARIH", smsDate);
            mCursor.moveToNext();
        }
    }
}

}

Upvotes: 3

Related Questions