No se puede convertir el Proveedor de acciones en Proveedor de acciones compartidas

A continuación está el código para mi actividad

import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.ShareActionProvider; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { private ShareActionProvider shareAction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.getItem(R.id.menu_settings); shareAction = (ShareActionProvider) item.getActionProvider(); return true; } } 

El problema es que hay un error de conversión de ActionProvider a ShareActionProvider.Why está debajo de activity_menu.xml

     

Tuve el mismo problema y encontré la solución:

1) Tienes que usar:

    

2) y en Java

 import android.support.v7.widget.ShareActionProvider; 

y

 // Locate MenuItem with ShareActionProvider MenuItem item = menu.findItem(R.id.menu_share); // Fetch and store ShareActionProvider mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item); 

menú:

  

Java:

 MenuItem menuItem = menu.findItem(R.id.action_share); mActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem); 

Está utilizando android.widget.ShareActionProvider , que es para la barra de acción nativa API Level 11+. Si está utilizando el backport de AppCompat de la barra de acciones, necesita usar android.support.v7.widget.ShareActionProvider lugar.

Me encontré con este problema siguiendo la guía de la barra de acciones de Android, que es básicamente lo que estás haciendo. Después de profundizar en las muestras que utilizan la barra de acción utilizando las bibliotecas compatibles con versiones anteriores de v7 y v4, terminé usando el siguiente código para onCreateOptionsMenu ().

 @Override public boolean onCreateOptionsMenu(Menu menu) { File file = new File(mFilePath); ShareCompat.IntentBuilder b = ShareCompat.IntentBuilder.from(this) .setType("image/png") .setStream(Uri.fromFile(file)); MenuItem item = menu.add("Share"); ShareCompat.configureMenuItem(item, b); MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); return true; } 

Un par de cosas a tener en cuenta aquí es que no está inflando desde un recurso de menú. El menú tiene el botón Compartir compartido predeterminado. Simplemente necesita especificar qué tipo de recurso está compartiendo con .setType. Como estoy compartiendo un archivo, necesito establecerStream, con Uri.fromFile (new File ()); Si estuvieras compartiendo texto, establecerías Type (“text / plain”).

También asegúrese de haber importado el proyecto de biblioteca $ SDK \ extras \ android \ support \ v7 \ appcompat, que contiene los paquetes necesarios. Además, como ha importado ese proyecto de biblioteca, su proyecto no necesita v4support.jar en su carpeta libs porque el proyecto de biblioteca ya lo tiene.

El problema fue que lo que @CommonsWare dijo acerca de no usar la biblioteca de soporte ShareActionProvider y que incluso si lo hiciera, tampoco funcionará porque cuando showAsAction Biblioteca de soporte requerimos Prefijos personalizados para algunas acciones como showAsAction

Sigue una regla simple que encontré útil

Con AppCompatActivity usa esto ,

     

También puede reemplazar el soporte: actionProviderClass con la aplicación: actionProviderClass y soporte: showAsAction con la aplicación: showAsAction

En su onCreateOptionsMenu ()

 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu resource getMenuInflater().inflate(R.menu.main_menu, menu); // Retrieve the share menu item MenuItem shareItem = menu.findItem(R.id.menu_share); // Now get the ShareActionProvider from the item mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); //set its ShareIntent. setShareIntent(shareIntent); return super.onCreateOptionsMenu(menu); } 

Con Activity usa esto ,

     

En su onCreateOptionsMenu()

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.actions, menu); ShareActionProvider share= (ShareActionProvider)menu.findItem(R.id.share) .getActionProvider(); share.setShareIntent(shareIntent); return(super.onCreateOptionsMenu(menu)); }