Как получить историю Chrome и закладки в Android Marshmallow (API >= 23)?
До уровня API 22 (т.е. до Lollipop) был способ прочитать историю и закладки из приложения Chrome (как показано в этой теме), используя разрешение com.android.browser.permission.READ_HISTORY_BOOKMARKS
.
Теперь, в Android API = 23 Marshmallow, поскольку вся система закладок браузера была удалена в Marshmallow (здесь), выше метод больше не работает.
Вот поток, который показывает, почему это невозможно.
В моих исследованиях до сих пор я не нашел хороших новостей. Google определенно убил функцию системных закладок (здесь и здесь), вопрос заключается в том, что Chrome Browser будет подвергать его каким-либо образом?
Есть ли замена/способ чтения Закладок и Истории из Chrome (даже конкретный Chrome ответил бы на этот вопрос) в Android Marshmallow?
Ответы
Ответ 1
В отличие от цитируемой документации, com.android.browser.permission.READ_HISTORY_BOOKMARKS
по-прежнему определяется каркасом и все равно может быть получена приложениями. К сожалению, на Marshmallow и позже Chrome проверяет другое разрешение, которое обычные приложения не могут получить. По соображениям совместимости, когда эта проверка разрешения неизбежно терпит неудачу, Chrome возвращает нулевые строки вместо того, чтобы бросать SecurityException
.
Здесь вы можете увидеть исходный код:
query()
вызывает hasReadAccess()
, который вызывает hasPermission("com.android.browser.permission.READ_HISTORY_BOOKMARKS")
, который по API >= M игнорирует аргумент разрешения и вместо этого проверяет com.android.chrome.permission.READ_WRITE_BOOKMARK_FOLDERS
. Это разрешение ограничено системными приложениями и приложениями, подписанными с помощью ключа Google.
Ответ 2
Для устройств ниже Marshmallow вы можете получить хромированную историю просмотров пошагово, как показано ниже.
if (mContext != null && mContext.getContentResolver() != null) {
long lastDateBookmarkGet = getPrefToSharedPreferences("lastDateBookmarkGet",mContext) != null ? (Long.valueOf(getPrefToSharedPreferences("lastDateBookmarkGet",mContext))) : 0;
Cursor cursor = mContext.getContentResolver().query(Uri.parse("content://com.android.chrome.browser/bookmarks"), null, "date >" + lastDateBookmarkGet, new String[] { "date" } , "date DESC");
if (cursor != null && cursor.getCount() > 0) {
if (cursor.moveToFirst()) {
do {
// Collect data from cursor
} while (cursor.moveToNext());
}
savePrefToSharedPreferences("lastDateBookmarkGet", String.valueOf(System.currentTimeMillis()), mContext);
} else if (cursor != null) {
Log.d("getBookMarksHist", "No new registers");
} else {
Log.d("getBookMarksHist", "Cursor is NULL");
}
}
public static void savePrefToSharedPreferences(String pref, String value, Context mContext) {
// Access Shared Preferences
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = preferences.edit();
// Save to SharedPreferences
editor.putString(pref, value);
editor.apply();
}
public static String getPrefToSharedPreferences(String pref, Context mContext) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
return preferences.getString(pref, null);
}
Ответ 3
Вы можете просмотреть свою историю, набрав
Chrome://history
Как ваш URL.