Search code examples
androidwebviewshareactionprovider

Passing URL from WebView to ShareActionProvider?


I want to take whatever page the user user is on in my WebView and allow them to share the URL with FaceBook/etc as a ACTION_SEND intent.

I tried this but obviously the URL doesn't exist in the onCreateOptionsMenu. How can I move it to the onOptionsItemsSelected?

private ShareActionProvider mShareActionProvider;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub


    return super.onOptionsItemSelected(item);
}
   @Override
public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.activity_main, menu);
     MenuItem item = menu.findItem(R.id.menu_item_share);
     mShareActionProvider = (ShareActionProvider)item.getActionProvider();
     mShareActionProvider.setShareHistoryFileName(
       ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
     mShareActionProvider.setShareIntent(createShareIntent());
     return true;   
}
 private Intent createShareIntent() {
      Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, 
          web.getUrl());
            return shareIntent;
        }

Solution

  • Your code above doesn't work because onCreateOptionsMenu is called only once, the first time the options menu is displayed.

    Fixing this is quite easy. We're building our Intent when onOptionsItemSelected is called. This is when any resource of the inflated menu is selected. If the selected item is the share resource, shareURLis executed which now builds and starts the Intent.

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    @Override
    public final boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item_share:
                shareURL();
        }
        return super.onOptionsItemSelected(item);
    }
    
    private void shareURL() {
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_TEXT, web.getUrl());
        startActivity(Intent.createChooser(shareIntent, "Share This!"));
    }
    

    I didn't test the code sample above. Neither on an actual device nor with the Java compiler. Nevertheless it should help you solving your problem.