Android:没有历史记录的ShareActionProvider

时间:2012-11-15 10:30:03

标签: android android-intent android-actionbar shareactionprovider

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

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

5 个答案:

答案 0 :(得分: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)导致我最初描述的问题。感谢您尝试回答Seven。

答案 1 :(得分:0)

阅读ActivityChooserModel上的源代码我发现历史文件是使用Context的openFileInput打开的。只要那个班级继续这样工作,你就能保持你的历史"清洁"如果你使用通常的方法删除这些类型的文件:

{0}
{0, 1}
{0, 1, 2}

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

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

答案 2 :(得分:0)

我尝试了所有,我正在使用旧的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);

答案 3 :(得分:-1)

添加如下代码:

    private void addShareSelectedListener() {
    if (null == mShareActionProvider) return;
    OnShareTargetSelectedListener listener = new OnShareTargetSelectedListener() {
        public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
            mContex.startActivity(intent);
            return true;
        }
    };

//Set to null if share history should not be persisted between sessions.
    mShareActionProvider.setShareHistoryFileName(null);
    mShareActionProvider.setOnShareTargetSelectedListener(listener);

}

更多信息请点击here

答案 4 :(得分:-1)

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