如何让app获取Android 浏览器访问历史记录,在API version大于23的版本上?

How to get browser history on android api version > 23 programmatically?

项目需要获取安卓手机的浏览器访问记录,但Android 6.0变更的时候把浏览器全局书签相关权限移除了,也就是说在6.0以上的版本(API 级别 大于等于23)的系统上没法调用Browser相关的方法区访问历史记录了。
那么还有没有其他什么方法,能让我的安卓APP获取手机浏览器的历史访问记录?

具体参见:https://developer.android.com/about/versions/marshmallow/android-6.0-changes?hl=zh-cn#behavior-bookmark-browser
浏览器书签变更
此版本移除了对全局书签的支持。android.provider.Browser.getAllBookmarks() 和 android.provider.Browser.saveBookmark() 方法现已移除。同样,READ_HISTORY_BOOKMARKS 权限和 WRITE_HISTORY_BOOKMARKS 权限也已移除。如果您的应用以 Android 6.0(API 级别 23)或更高版本为目标平台,请勿从全局提供程序访问书签或使用书签权限。您的应用应改为在内部存储书签数据。

基于GPT以及个人专业回答

在Android 6.0以上的版本(API级别大于等于23)中,访问浏览器历史记录被禁止,无法使用 READ_HISTORY_BOOKMARKS 权限和 WRITE_HISTORY_BOOKMARKS 权限来获取浏览器数据。但是,仍然可以通过以下两种方式来获取浏览器历史记录:

使用 AccessibilityService:通过实现 AccessibilityService 来监视用户的操作,在用户打开浏览器、访问网页时,将相关的信息记录下来,作为访问历史记录。

使用 Content Provider API:使用 Android 系统提供的 Content Provider API,通过扫描浏览器数据库中的表来获取浏览历史数据。但是需要注意的是,Content Provider API 不稳定,而且不保证可以在所有设备上运行,且可能会在未来的版本中被移除。此外,使用这种方法需要获得系统的“com.android.browser.permission.READ_HISTORY_BOOKMARKS”权限,这与移除全局书签权限的初衷相违背。

要么使用 AccessibilityService,要么使用 Content Provider API,都需要知道其风险和限制,并权衡后再决定是否使用。

是的,就像你说的,为了保证用户的隐私,谷歌已经不允许app获取浏览器的数据了。因此也就无法直接通过现有的接口去获取浏览器的书签等数据。只能找下有没有第三方的工具实现对浏览器的监听。但不管哪种方式,都需要注意让用户知道并做好隐私保护,否则属于侵权的违法行为。

在Android 6.0及以上的版本中,由于浏览器全局书签相关权限被移除,因此无法直接访问手机浏览器的历史记录。不过,您可以通过以下方式来获取浏览器的访问记录:

1.使用Chrome Custom Tabs:Chrome Custom Tabs是一个Android组件,允许您在应用中嵌入Chrome浏览器,以便用户可以在应用中浏览网页。您可以使用Chrome Custom Tabs来记录用户访问的网页地址。

2.使用Accessibility Service:Accessibility Service是一种服务,允许您监听系统中发生的事件,并执行一些操作。您可以使用Accessibility Service监听用户在浏览器中打开的URL,并将其记录下来。

3.使用WebView:如果您的应用内置了WebView,可以通过WebViewClient类来监听用户在WebView中打开的URL,并将其记录下来。

需要注意的是,以上方法可能会涉及到用户隐私问题,因此需要在应用中进行适当的提示和说明,并获得用户的授权。

另外,如果您只需要获取用户在您的应用中访问的网页地址,可以使用Android系统提供的WebView类来记录用户访问的URL。您可以通过WebViewClient类的回调方法来监听用户在WebView中打开的URL,并将其记录下来。这种方法不需要访问浏览器的历史记录,因此可以在Android 6.0及以上的版本中正常使用。

参考一下这个链接:https://www.likecs.com/ask-1633139.html

可以借鉴下

private void browserHistoryDOM() {

try{

File newxmlfile = new File("/sdcard/Xmlfiles/briwserHistory.xml");

newxmlfile.createNewFile();

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

Document document = documentBuilder.newDocument();

Element rootElement = document.createElement("root");

document.appendChild(rootElement);

Cursor mCur = managedQuery(Browser.BOOKMARKS_URI,Browser.HISTORY_PROJECTION, null, null, null);

mCur.moveToFirst();

if (mCur.moveToFirst() && mCur.getCount() > 0) {

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

Element em = document.createElement("bookmarkIdx");

em.appendChild(document.createTextNode(mCur.getString(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX)));

rootElement.appendChild(em);

long callDate = Long.parseLong(mCur.getString(Browser.HISTORY_PROJECTION_DATE_INDEX));

SimpleDateFormat datePattern = new SimpleDateFormat ("dd-MM-yyyy/h:m:s:a");

datePattern.setTimeZone(TimeZone.getTimeZone("GMT"));

String date_str = datePattern.format(new Date(callDate));

Element em1 = document.createElement("dateIdx");

em1.appendChild(document.createTextNode(date_str));

rootElement.appendChild(em1);

Element em2 = document.createElement("idIdx");

em2.appendChild(document.createTextNode(mCur.getString(Browser.HISTORY_PROJECTION_ID_INDEX)));

rootElement.appendChild(em2);

Element em3 = document.createElement("titleIdx");

em3.appendChild(document.createTextNode(mCur.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX)));

rootElement.appendChild(em3);

Element em4 = document.createElement("urlIdx");

em4.appendChild(document.createTextNode(mCur.getString(Browser.HISTORY_PROJECTION_URL_INDEX)));

rootElement.appendChild(em4);

Element em5 = document.createElement("visitsIdx");

em5.appendChild(document.createTextNode(mCur.getString(Browser.HISTORY_PROJECTION_VISITS_INDEX)));

rootElement.appendChild(em5);

long searchDate = Long.parseLong(mCur.getString(Browser.SEARCHES_PROJECTION_DATE_INDEX));

SimpleDateFormat datePattern1 = new SimpleDateFormat ("dd-MM-yyyy/h:m:s:a");

datePattern1.setTimeZone(TimeZone.getTimeZone("GMT"));

String date_str1 = datePattern.format(new Date(searchDate));

Element em6 = document.createElement("searchDateIdx");

em6.appendChild(document.createTextNode(date_str1));

rootElement.appendChild(em6);

Element em7 = document.createElement("searchIdx");

em7.appendChild(document.createTextNode(mCur.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX)));

rootElement.appendChild(em7);

Element em8 = document.createElement("truncateIdIdx");

em8.appendChild(document.createTextNode(mCur.getString(Browser.TRUNCATE_HISTORY_PROJECTION_ID_INDEX)));

rootElement.appendChild(em8);

Element em9 = document.createElement("truncateOldest");

em9.appendChild(document.createTextNode(mCur.getString(Browser.TRUNCATE_N_OLDEST)));

rootElement.appendChild(em9);

mCur.moveToNext();

}

}

TransformerFactory transformerFactory = TransformerFactory.newInstance();

Transformer transformer = transformerFactory.newTransformer();

DOMSource source = new DOMSource(document);

StreamResult result = new StreamResult(newxmlfile);

transformer.transform(source, result);

} catch (Exception e) {

e.printStackTrace();

}

}

通过使用上面的方法,我可以获得浏览器历史记录,并能够将数据保存到sdcard上的xml文件中.


以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

在Android 6.0以上版本,由于权限限制,无法直接通过BrowserProvider访问浏览器历史记录。

但还有其他方法可以实现:

  1. 通过WebView获取历史记录
    可以使用WebView加载about:history URL,通过WebViewClient的onPageFinished方法获取WebView加载的页面内容,从中提取历史记录信息。
  2. 使用访问ibility服务获取历史记录
    可以通过accessibility服务监控浏览器 app,获取其显示的网页标题和url,保存为历史记录。
  3. 读取浏览器数据库获取历史记录
    可以通过adb shell和SQLite数据库读取某些浏览器app的历史记录数据库获取访问历史。(不同浏览器存储方式不同,需要针对具体浏览器实现)
  4. 利用Android的 radical 查询功能查询浏览记录
    在Android中可以通过radical查询(Recent Tasks)查看最近运行的app。可以通过此功能查看浏览器最近访问的网页,提取url和title保存历史记录。(需要用户授权RADICAL权限)
  5. 第三方浏览器插件获取历史记录
    如果是通过谷歌浏览器访问,可以通过谷歌浏览器插件的方式获取历史记录。

具体实现方法可以参考:

  1. WebView方法:
java
WebView webView = new WebView(this);
webView.loadUrl("about:history");
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        String pageContent = webView.getTitle() + ";" + webView.getUrl();
        // 从pageContent提取历史记录,保存 
    }
});

  1. accessibility服务方法:
    需要创建一个accessibility服务,在onAccessibilityEvent方法中监听网页TITLE和URL变化,保存历史记录。
  2. 读取浏览器数据库:
    可以参考https://www.jianshu.com/p/323dbd1c2f4d
  3. radical查询方法:
    需要请求RADICAL权限,启动ActivityManager并查询recent tasks,从中获取浏览器访问记录。