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

私はすべて試しましたが、古いwidget.ShareActionProvider(compat 7ではない)を使用しているため、nullはクラッシュにつながり、deleteFileは確実に削除されますが、アプリの再起動後も履歴は常に存在します...したがって、機能するものが1つだけ見つかりました:ランダム!

    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 に答える
0

ActivityChooserModel のソース コードを読むと、Context の openFileInput を使用して履歴ファイルが開かれていることがわかりました。そのクラスがそのように機能し続ける限り、これらの種類のファイルの通常の方法を使用して履歴を削除すると、履歴を「クリーン」に保つことができます。

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

選択したアプリケーションが開いているとき、 「最も使用されている」アイコンしばらく表示されますが、ユーザーがアプリに戻るとすぐに消えます。

必要に応じて、onShareTargetSelected メソッドでファイルを削除することもできます。

于 2015-07-16T22:20:43.747 に答える
-1

com.actionbarsherlock.widget.ShareActionProvider の onCreateActionView を変更してから、ActivityChooserModel のメソッドを呼び出します: setHistoryMaxSize(0)

于 2013-07-18T07:11:38.447 に答える