Nano Hash - криптовалюты, майнинг, программирование

Настройте намерение Android.ACTION_SEND

Я использую Intent для обмена URL и темой. В этом фильтре намерений показаны все приложения для обмена. я хочу только (facebook/gmail/message/skype/twitter) эту опцию во всплывающем окне. можно ли настроить фильтр намерения совместного использования.

 Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
 sharingIntent.setType("text/plain");
 String shareBody = adapter.getDetails("url";
 sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"subject");
 sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
 startActivity(Intent.createChooser(sharingIntent, "Share via"));

Спасибо


Ответы:


1

Да, это возможно. Посмотрите ниже, где показана фильтрация для Facebook, Gmail, Twitter.

Обновлено для обмена текстом и изображением:

Выберите образ с SDCard:

String fileName = "image-3116.jpg";
String externalStorageDirectory = Environment.getExternalStorageDirectory().toString();
String myDir = externalStorageDirectory + "/saved_images/"; // the
            // file will be in saved_images
Uri uri = Uri.parse("file:///" + myDir + fileName);

Поделиться через Twitter

  Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
   shareIntent.setType("text/plain");
   shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (String) v.getTag(R.string.app_name));
   shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, (String) v.getTag(R.drawable.ic_launcher));
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

   PackageManager pm = v.getContext().getPackageManager();
   List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
     for (final ResolveInfo app : activityList) 
      {
        if ("com.twitter.android.PostActivity".equals(app.activityInfo.name))
          {
             final ActivityInfo activity = app.activityInfo;
             final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
             shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
             shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
             shareIntent.setComponent(name);
             v.getContext().startActivity(shareIntent);
            break;
          }
        }

Поделиться через Facebook

   Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
   shareIntent.setType("text/plain");
   shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (String) v.getTag(R.string.app_name));
   shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, (String) v.getTag(R.drawable.ic_launcher));
   shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

   PackageManager pm = v.getContext().getPackageManager();
   List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
     for (final ResolveInfo app : activityList) 
     {
         if ((app.activityInfo.name).startsWith("com.facebook.katana")) 
         {
           final ActivityInfo activity = app.activityInfo;
           final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
          shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
          shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
          shareIntent.setComponent(name);
          v.getContext().startActivity(shareIntent);
          break;
        }
      }

Поделиться через Gmail

  Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
  shareIntent.setType("text/plain");
  shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (String) v.getTag(R.string.app_name));
  shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, (String) v.getTag(R.drawable.ic_launcher));
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

   PackageManager pm = v.getContext().getPackageManager();
   List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
       for (final ResolveInfo app : activityList) 
        {
          if ((app.activityInfo.name).contains("android.gm")) 
           {
             final ActivityInfo activity = app.activityInfo;
             final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
            shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
             shareIntent.setComponent(name);
             v.getContext().startActivity(shareIntent);
             break;
           }
       }

Поделиться через WhatsApp:

 Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/html");
shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (String) v.getTag(R.string.app_name));
 shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, (String) v.getTag(R.drawable.ic_launcher));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
        for (final ResolveInfo app : activityList) {
            if ((app.activityInfo.name).contains("com.whatsapp")) {
                    final ActivityInfo activity = app.activityInfo;
                    final ComponentName name = new ComponentName(
                                activity.applicationInfo.packageName, activity.name);
                          shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                        shareIntent.setComponent(name);
                        v.getContext().startActivity(shareIntent);
                        break;
                    }
                }
16.11.2013
  • Facebook больше не принимает EXTRA_PARAMETERS. developers.facebook.com/x/bugs/332619626816423 25.03.2014
  • for (окончательное приложение ResolveInfo: activityList) не разрешается для facebook, его тип отображения несоответствие: невозможно преобразовать тип элемента Object в ResolveInfo 02.05.2014
  • Отличное решение! Есть только несколько вещей, которые нужно улучшить. Я реализовал его только для твиттера, поэтому расскажу только о твиттер-шаре. Итак, во-первых, вам нужно указать тип списка: List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0); , а во-вторых, название активности для твиттера может быть не совсем com.twitter.android.PostActivity, поэтому проверять с этим опасно, лучше сделать так: if (app.activityInfo.name.contains("twitter")) {.....} 17.05.2014
  • @андраник . Я уже знаю об этом и реализовал таким образом. Но я предложил общее решение. Спасибо за ваше предложение. 18.05.2014
  • Это не работает, если у пользователя установлено приложение Facebook и приложение Facebook messenger. Он может выбрать неправильное приложение. 25.08.2014
  • Есть ли способ различить два приложения facebook? 07.08.2015
  • @GregEnnis Какой проход v.getTag ?? какой объект?? 08.08.2015
  • я использую com.facebook вместо com.facebook.katana, это соответствует facebook и работает нормально. 28.04.2016
  • @ Ankur1994a Ankur1994a Это также может сработать, потому что facebook изменил бы имя своего пакета. 28.04.2016

  • 2

    Один метод для нескольких функций

    Код функции share(String nameApp,String imagePath,String message):

    public void share(String nameApp, String imagePath, String message) {
        try {
            List<Intent> targetedShareIntents = new ArrayList<Intent>();
            Intent share = new Intent(android.content.Intent.ACTION_SEND);
            share.setType("image/jpeg");
            List<ResolveInfo> resInfo = getPackageManager()
                    .queryIntentActivities(share, 0);
            if (!resInfo.isEmpty()) {
                for (ResolveInfo info : resInfo) {
                    Intent targetedShare = new Intent(
                            android.content.Intent.ACTION_SEND);
                    targetedShare.setType("image/jpeg"); // put here your mime
                                                            // type
                    if (info.activityInfo.packageName.toLowerCase().contains(
                            nameApp)
                            || info.activityInfo.name.toLowerCase().contains(
                                    nameApp)) {
                        targetedShare.putExtra(Intent.EXTRA_SUBJECT,
                                "Sample Photo");
                        targetedShare.putExtra(Intent.EXTRA_TEXT, message);
                        targetedShare.putExtra(Intent.EXTRA_STREAM,
                                Uri.fromFile(new File(imagePath)));
                        targetedShare.setPackage(info.activityInfo.packageName);
                        targetedShareIntents.add(targetedShare);
                    }
                }
                Intent chooserIntent = Intent.createChooser(
                        targetedShareIntents.remove(0), "Select app to share");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                        targetedShareIntents.toArray(new Parcelable[] {}));
                startActivity(chooserIntent);
            }
        } catch (Exception e) {
            Log.v("VM",
                    "Exception while sending image on" + nameApp + " "
                            + e.getMessage());
        }
    }
    

    Для прикрепления изображения к gmail, facebook, twitter с текстом используйте приведенный ниже код.

    File filePath = new File("your image path");
    share("gmail", filePath.toString(),"your comment");
    share("facebook", filePath.toString(),"your comment");
    share("twitter", filePath.toString(),"your comment");
    
    16.11.2013
  • Можно ли поделиться в Google+ и LinkedIn с одним и тем же кодом? если нет, то какие изменения должны быть сделаны 04.02.2015

  • 3

    Приведенный выше ответ открывает приложение чата facebook на моем телефоне. Для следующего работал !!

    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                    sharingIntent.setType("text/plain");
                    sharingIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                    sharingIntent.putExtra(Intent.EXTRA_TEXT, "Text...");
                    PackageManager packManager = getPackageManager();
                    List<ResolveInfo> resolvedInfoList = packManager.queryIntentActivities(sharingIntent,  PackageManager.MATCH_DEFAULT_ONLY);
    
                    boolean resolved = false;
                    for(ResolveInfo resolveInfo: resolvedInfoList){
                        if(resolveInfo.activityInfo.packageName.startsWith("com.facebook.katana")){
                            sharingIntent.setClassName(
                                resolveInfo.activityInfo.packageName, 
                                resolveInfo.activityInfo.name );
                            resolved = true;
                            break;
                        }
                    }
                    if(resolved){
                        startActivity(sharingIntent);
                    }else{
    
                         Builder alert  = new AlertDialog.Builder(ActivityName.this);
                            alert.setTitle("Warning");
                            alert.setMessage("Facebook App not found");
                            alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int which) 
                                {
                                    dialog.dismiss();
    
                                }
                            });
                            alert.show();
                    } 
    
    24.01.2014
  • +1 за то, что поделился! но я не могу отправить какой-либо текст/изображение.... я знаю, что это ошибка... но есть ли обходной путь без использования facebook sdk? 31.03.2015

  • 4

    Вы не можете поделиться Extras с изображением без использования facebook sdk.

    https://developers.facebook.com/x/bugs/332619626816423/

    06.10.2015
  • Мистер DownVoter, скажите мне, что не так в моем ответе, чтобы исправить это и поучиться у вас, спасибо. 25.03.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..