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访问浏览器历史记录。
但还有其他方法可以实现:
具体实现方法可以参考:
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提取历史记录,保存
}
});