根据Android文档,如果我不希望我的ShareActionProvider持久化共享历史,我应该调用
mShareActionProvider.setShareHistoryFileName(null)
但是,当我这样做时,我在选择共享选项时遇到以下崩溃:
11-15 10:06:34.848: E/AndroidRuntime(22461): java.lang.IllegalStateException: No preceding call to #readHistoricalData
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserModel.persistHistoricalDataIfNeeded(ActivityChooserModel.java:573)
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserModel.addHisoricalRecord(ActivityChooserModel.java:743)
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserModel.chooseActivity(ActivityChooserModel.java:491)
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserView$Callbacks.onItemClick(ActivityChooserView.java:547)
下面是设置ShareActionProvider的代码:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.article_pager_menu, menu);
// mShareActionProvider is a field in the Activity
mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
.getActionProvider();
mShareActionProvider
.setShareHistoryFileName(null);
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
mShareActionProvider.setShareIntent(shareIntent);
mShareActionProvider.onCreateActionView();
return true;
}
你知道我该怎么解决这个问题吗?
发布于 2012-12-19 02:47:19
所以最后我不得不通过复制Android源代码中的ShareActionProvider来编写我自己的代码。我还必须复制源代码中的ActivityChooserView和ActivityChooserModel。在操作栏中隐藏默认活动所需的实际修改是在ActivityChooserView的updateAppearance()方法中。它应该是这样的:
private void updateAppearance() {
// Expand overflow button.
if (mAdapter.getCount() > 0) {
mExpandActivityOverflowButton.setEnabled(true);
} else {
mExpandActivityOverflowButton.setEnabled(false);
}
mDefaultActivityButton.setVisibility(View.GONE);
if (mDefaultActivityButton.getVisibility() == VISIBLE) {
mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground);
} else {
mActivityChooserContent.setBackgroundDrawable(null);
}
}
我不明白为什么setShareHistoryFileName(null)会导致我最初描述的问题。感谢您尝试回答Seven。
发布于 2015-07-17 06:20:44
阅读ActivityChooserModel上的源代码,我发现历史文件是使用Context的openFileInput打开的。只要这个类继续像那样工作,如果你使用那些文件的常用方法删除它,你将能够保持你的历史记录“干净”:
getApplicationContext().deleteFile(SHARE_HISTORY_FILE_NAME);
shareActionProvider.setShareHistoryFileName(SHARE_HISTORY_FILE_NAME);
当选定的应用程序打开时,“最常用”图标将显示一段时间,但一旦用户返回到您的应用程序,它就会消失。
如果需要,您还可以删除onShareTargetSelected方法上的文件。
发布于 2016-12-01 03:07:21
我尝试了所有的方法,我使用的是旧的widget.ShareActionProvider (不是compat 7),所以null会导致崩溃,deleteFile肯定会删除,但应用重启后历史记录仍然存在……所以我只发现了一个有用的东西:随机!
String fname=ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME;
try {
fname = prefs.getString("SHARE_HISTORY_FILE_NAME", ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
getApplicationContext().deleteFile(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
fname="SHARE_HISTORY_FILE_NAME"+Math.random()*1000;
SharedPreferences.Editor ed = prefs.edit();
ed.putString("SHARE_HISTORY_FILE_NAME", fname);
ed.commit();
} catch (Exception e) {
Log.e(TAG,"err "+e.toString());
}
mSharedActionProvider.setShareHistoryFileName(fname);
https://stackoverflow.com/questions/13395601
复制相似问题