当前位置: 首页 > 工具软件 > ShareMenu > 使用案例 >

Android Api Demos登顶之路(二十九)Share Action Provider

袁谭三
2023-12-01

这个demo演示了ShareActionProvider的用法。Android也提供好了几个内置的Action Provider, ShareActionProvider就是其中一个。
menu目录下的share_provider.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/action_share_actionbar"
        android:title="Share with..."
        android:showAsAction="always"
        android:actionProviderClass="android.widget.ShareActionProvider"/>
    <item android:id="@+id/action_share_overflow"
        android:title="Share with..."
        android:showAsAction="never"
        android:actionProviderClass="android.widget.ShareActionProvider"/>
</menu>

MainActivity

public class MainActivity extends Activity {
    private static final String SHARED_FILE_NAME="shared.png";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        copyImageFromRaw();
    }

    /**
     *  将资源文件中的图片复制到当前,命名为shared.png
     */
    private void copyImageFromRaw() {
        InputStream is=null;
        OutputStream os=null;
        try {
            is=getResources().openRawResource(R.raw.robot);
            byte[] buffer=new byte[1024];
            int len=0;
            //设置文件的输出模式为其它应用可以读取并且可以在原来的基础上添加内容
            //否则图片不会被列出的应用(共享图片的应用)打开
            os=openFileOutput(SHARED_FILE_NAME, Context.MODE_WORLD_READABLE|Context.MODE_APPEND);
            while((len=is.read(buffer))>0){
                os.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                is.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.share_provider, menu);
        MenuItem actionItem = menu.findItem(R.id.action_share_actionbar);
        ShareActionProvider actionProvider = (ShareActionProvider) actionItem
                .getActionProvider();
        /*默认情况,ShareActionProvider对象会基于用户的使用频率来保留共享目标的排列顺序。
        使用频率高的目标应用程序会显示在下来列表的上面,并且最常用的目标会作为默认共享目标直接显示在操作栏。
        默认情况下,排序信息被保存在由DEFAULT_SHARE_HISTORY_FILE_NAME指定名称的私有文件中。
        如果你只使用一种操作类型ShareActionProvider类或它的一个子类,那么你应该继续使用这个默认的
        历史文件,而不需要做任何事情。但是,如果你使用了不同类型的多个操作的ShareActionProvider类或
        它的一个子类,那么为了保持它们自己的历史,每种ShareActionProvider类都应该指定它们自己的历史
        文件。*/
        actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
        actionProvider.setShareIntent(createIntent());

        MenuItem overflowItem = menu.findItem(R.id.action_share_overflow);
        ShareActionProvider overflowProvider = (ShareActionProvider) overflowItem
                .getActionProvider();
        overflowProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
        overflowProvider.setShareIntent(createIntent());
        return true;
    }

    //创建Intent,并将一张默认的图片添加到应用中
    //列出所有能够发送图片的应用
    private Intent createIntent() {
        Intent intent=new Intent(Intent.ACTION_SEND);
        //设置发送内容的类型为图片
        intent.setType("image/*");
        Uri uri=Uri.fromFile(getFileStreamPath("shared.png"));
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        return intent;
    }

}
 类似资料: