Невозможно передать Поставщик действия поставщику действия - программирование
Подтвердить что ты не робот

Невозможно передать Поставщик действия поставщику действия

Ниже приведен код моей активности

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

Проблема заключается в том, что в ActionProvider есть личная ошибка для ShareActionProvider.Почему это так ниже - activity_menu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/menu_settings"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="@string/menu_settings"
    android:actionProviderClass="android.widget.ShareActionProvider"
    />

</menu>
4b9b3361

Ответ 1

У меня была та же проблема, и я нашел решение:

1) Вы должны использовать:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bwq="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_share"
        android:title="@string/menu_share"
        bwq:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        bwq:showAsAction="always"/>
</menu>

2) и в Java

import android.support.v7.widget.ShareActionProvider;

и

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

Ответ 2

меню:

<item
    android:id="@+id/action_share"
    android:title="@string/action_share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

Java:

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

Ответ 3

Вы используете android.widget.ShareActionProvider, который предназначен для панели действий API уровня 11+. Если вы используете вспомогательный порт AppCompat на панели действий, вам нужно вместо этого использовать android.support.v7.widget.ShareActionProvider.

Ответ 4

Я столкнулся с этой проблемой, следуя андровому файлу action android dev, который в основном является тем, что вы делаете. После того, как вы пробрались в образцы, которые используют панель действий, используя обратные совместимые библиотеки поддержки v7 и v4, я закончил использование следующего кода для 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;
    }

Несколько вещей, чтобы отметить здесь, это то, что вы не надуваетесь из ресурса меню. В меню добавлена ​​кнопка совместного использования по умолчанию. Вам просто нужно указать, какой тип ресурса вы используете с .setType. Поскольку я делюсь файлом, мне нужно setStream, с Uri.fromFile(new File()); Если вы делились текстом, вы бы установилиType ( "text/plain" ).

Также убедитесь, что вы импортировали проект $SDK\extras\android\support\v7\appcompat library, который содержит необходимые пакеты. Кроме того, поскольку они импортировали этот проект библиотеки, вашему проекту не нужен v4support.jar в папке libs, потому что проект библиотеки уже имеет его.

Ответ 5

Проблема заключалась в том, что то, что @CommonsWare говорило о том, что не использует библиотеку поддержки ShareActionProvider, и даже если бы я это сделал, то это также не сработало, потому что при использовании библиотеки поддержки нам нужны пользовательские префиксы для некоторых действий, таких как showAsAction

Ответ 6

Следуйте простому правилу, которое я нашел полезным

С AppCompatActivity используйте это,

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:support="http://schemas.android.com/apk/res-auto">

    <!--
      To use ShareActionProvider, we reference the class by set the
      support:actionProviderClass attribute with the full class name of ShareActionProvider.
    -->
    <item
        android:id="@+id/menu_share"
        android:title="@string/menu_share"
        support:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        support:showAsAction="always" />

</menu>

Вы также можете заменить support: actionProviderClass на app: actionProviderClass и support: showAsAction на app: showAsAction

В вашем 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);
    }

С Activity используйте это,

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/share"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        tools:ignore="MenuTitle" />

</menu>

В вашем 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));
  }

Ответ 7

Ни одно из решений здесь не решило мою проблему с ShareActionProvider, не приводя/не возвращая null. В итоге я заменил ShareActionProvider на Intent.SEND_ACTION, чтобы делиться изображениями в моем приложении, как показано в учебнике по Android для разработчиков: https://developer.android.com/training/sharing/send

Хотя Google упоминает в этом руководстве, что: Note: The best way to add a share action item to an ActionBar is to use ShareActionProvider, which became available in API level 14. ShareActionProvider is discussed in the lesson about Adding an Easy Share Action. Я нашел гораздо проще реализовать только Intention.SEND_ACTION. Не уверен, есть ли другие причины для реализации ShareActionProvider...

Ответ 8

Это было задано несколько лет назад, поэтому существующие ответы, вероятно, работали тогда. Однако на момент написания этой статьи предлагаемый код выдает много предупреждений об устаревании, и это не решает проблему.

В конце концов я решил проблему, и она нигде не была задокументирована в Интернете (что я смог найти), поэтому, надеюсь, этот ответ поможет людям, которые в настоящее время сталкиваются с этой же проблемой.

Решение для меня было в заявлении на импорт. Когда я впервые использовал SharedActionProvider, Android Studio может автоматически добавлять импорт. Он предоставляет две опции для импорта: android.widget.ShareActionProvider и androidx.appcompat.widget.ShareActionProvider.

Первый нарушается и приводит к ошибке о том, что приведение никогда не будет успешным. Последнее заставит все работать правильно. app:ActionProviderClass в файле меню должен совпадать с именем импортируемого файла.