androidandroid-intentandroid-actionbarshareactionprovider

Android: ShareActionProvider with no history


According to the Android documentation if I don't want my ShareActionProvider to persist the share history I should call

mShareActionProvider.setShareHistoryFileName(null)

However when I do this I get the following crash on selecting a share option:

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)

Here is the code that sets up the 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;
}

Any ideas how I can fix this?


Solution

  • So in the end I had to write my own ShareActionProvider by copying the one found in Android source. I also had to copy over the ActivityChooserView and the ActivityChooserModel from source. The actual modification needed to hide the default activity in the action bar is in the updateAppearance() method in the ActivityChooserView. This is how it should look:

    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);
        }
    }
    

    I couldn't figure out why setShareHistoryFileName(null) was causing the problem I originally described though. Thanks for the attempted answer Seven.