8

根据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;
}

有什么想法可以解决这个问题吗?

4

4 回答 4

8

所以最后我不得不通过复制在 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) 会导致我最初描述的问题。感谢您尝试回答七。

于 2012-12-18T18:47:18.937 回答
0

阅读 ActivityChooserModel 上的源代码,我发现历史文件是使用 Context 的 openFileInput 打开的。只要该类继续这样工作,如果您使用这些文件的常用方法删除它,您就可以保持历史“干净”:

getApplicationContext().deleteFile(SHARE_HISTORY_FILE_NAME);
shareActionProvider.setShareHistoryFileName(SHARE_HISTORY_FILE_NAME);

当所选应用程序打开时, “最常用”图标显示一段时间,但一旦用户回到您的应用程序,它就会消失。

如果需要,您还可以删除 onShareTargetSelected 方法中的文件。

于 2015-07-16T22:20:43.747 回答
0

我尝试了所有,我使用的是旧的 widget.ShareActionProvider(不是兼容 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);
于 2016-11-30T19:07:21.250 回答
-1

修改com.actionbarsherlock.widget.ShareActionProvider的onCreateActionView然后调用ActivityChooserModel的方法:setHistoryMaxSize(0)

于 2013-07-18T07:11:38.447 回答