Общий доступ к facebook, твиттер через Android-браузер

В настоящее время я пытаюсь передать текст в gmail, facebook и твиттер. Я использую метод совместного использования акций. Ниже приведен код, который я использовал

Intent sharingIntent = new Intent(Intent.ACTION_SEND); sharingIntent.setType("plain/text"); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My text"); startActivity(Intent.createChooser(sharingIntent,"Share using")); 

В приведенном выше коде отображаются только такие параметры, как gmail и skype. Почему параметры facebook и twitter не отображаются в списке, хотя у меня было приложение facebook и twitter, установленное на моем устройстве?

Solutions Collecting From Web of "Общий доступ к facebook, твиттер через Android-браузер"

Я не знаю, читает ли кто-нибудь это, но если люди все еще ищут, я нашел более легкий ответ:

 List<Intent> targetedShareIntents = new ArrayList<Intent>(); Intent facebookIntent = getShareIntent("facebook", "subject", "text"); if(facebookIntent != null) targetedShareIntents.add(facebookIntent); Intent twitterIntent = getShareIntent("twitter", "subject", "text"); if(twitterIntent != null) targetedShareIntents.add(twitterIntent); Intent gmailIntent = getShareIntent("gmail", "subject", "text"); if(gmailIntent != null) targetedShareIntents.add(gmailIntent); Intent chooser = Intent.createChooser(targetedShareIntents.remove(0), "Delen"); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{})); startActivity(chooser); 

И метод getShareIntent (этот метод ищет текст типа mime / plain, вы можете использовать другие типы mime для поиска по этим типам или использовать / * / для поиска по всем типам:

 private Intent getShareIntent(String type, String subject, String text) { boolean found = false; Intent share = new Intent(android.content.Intent.ACTION_SEND); share.setType("text/plain"); // gets the list of intents that can be loaded. List<ResolveInfo> resInfo = getActivity().getPackageManager().queryIntentActivities(share, 0); System.out.println("resinfo: " + resInfo); if (!resInfo.isEmpty()){ for (ResolveInfo info : resInfo) { if (info.activityInfo.packageName.toLowerCase().contains(type) || info.activityInfo.name.toLowerCase().contains(type) ) { share.putExtra(Intent.EXTRA_SUBJECT, subject); share.putExtra(Intent.EXTRA_TEXT, text); share.setPackage(info.activityInfo.packageName); found = true; break; } } if (!found) return null; return share; } return null; } 

Если вы не хотите использовать этот метод, вы можете просто создать такие намерения:

 Intent normalIntent = new Intent(Intent.ACTION_SEND); normalIntent.setType("text/plain"); normalIntent.setPackage("com.katana.facebook"); // I just know the package of Facebook, the rest you will have to search for or use my method. normalIntent.putExtra(Intent.EXTRA_TEXT, "The text you want to share to Facebook"); 

Совместное использование с Facebook связано с тем, что он принимает только URL-адрес в EXTRA_TEXT. Собственное приложение FB затем захватит текст и изображение из этого URL-адреса, чтобы составить сообщение. Это не «ошибка», а предполагаемое поведение, которое они дают официальному приложению: – /

Примите во внимание, что Twitter будет принимать только текст / обычную без разметки и с 144 символами при макс.

Я сделал свой собственный диалог «Поделиться», чтобы перехватить все разные поведения и дать каждому целевому назначению то, что они принимают: HTML, обычный текст, URL FB и короткий текст Twitter.

Вот код:

 public class ShareHelper implements AdapterView.OnItemClickListener { private static final String TAG = ShareHelper.class.getSimpleName(); private Activity mContext; private Dialog mDialog; private LayoutInflater mInflater; private GridView mGrid; private ShareIntentAdapter mAdapter; private int mMaxColumns; private List<ResolveInfo> plainTextActivities; private Set<String> htmlActivitiesPackages; private String subject; private String textbody; private CharSequence htmlbody; private String twitterBody; private String facebookBody; public ShareHelper(Activity context, String subject, String textbody, CharSequence htmlbody, String twitterBody, String facebookBody) { this.mContext = context; this.subject = subject; this.textbody = textbody; this.htmlbody = htmlbody; this.twitterBody = twitterBody; this.facebookBody = facebookBody; } @SuppressLint("NewApi") public void share() { this.mInflater = LayoutInflater.from(mContext); final Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND); sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); plainTextActivities = mContext.getPackageManager().queryIntentActivities(sendIntent, 0); if (plainTextActivities.size() > 0) { htmlActivitiesPackages = new HashSet<String>(); sendIntent.setType("text/html"); final List<ResolveInfo> htmlActivities = mContext.getPackageManager().queryIntentActivities(sendIntent, 0); for (ResolveInfo resolveInfo : htmlActivities) { htmlActivitiesPackages.add(resolveInfo.activityInfo.packageName); } mAdapter = new ShareIntentAdapter(); final View chooserView = mInflater.inflate(R.layout.dialog_share_us_chooser, null); mGrid = (GridView) chooserView.findViewById(R.id.resolver_grid); mGrid.setAdapter(mAdapter); mGrid.setOnItemClickListener(this); mMaxColumns = mContext.getResources().getInteger(R.integer.maxResolverActivityColumns); mGrid.setNumColumns(Math.min(plainTextActivities.size(), mMaxColumns)); AlertDialog.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { builder = new AlertDialog.Builder(mContext, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); } else { builder = new AlertDialog.Builder(mContext); } builder.setTitle(R.string.text_share_us_title); builder.setView(chooserView); mDialog = builder.create(); mDialog.show(); } else { Toast.makeText(mContext, "No social apps installed to share ChurchLink!", Toast.LENGTH_LONG).show(); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ResolveInfo info = (ResolveInfo) mAdapter.getItem(position); Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setClassName(info.activityInfo.packageName, info.activityInfo.name); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TITLE, subject); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (info.activityInfo.packageName.contains("facebook")) { intent.putExtra(Intent.EXTRA_TEXT, facebookBody); } else if (info.activityInfo.packageName.contains("twitter")) { intent.putExtra(Intent.EXTRA_TEXT, twitterBody); } else if (htmlActivitiesPackages.contains(info.activityInfo.packageName)) { intent.putExtra(Intent.EXTRA_TEXT, htmlbody); } else { intent.putExtra(Intent.EXTRA_TEXT, textbody); } Log.d(TAG, info.activityInfo.packageName); ((Activity) mContext).startActivity(intent); mDialog.dismiss(); } public class ShareIntentAdapter extends BaseAdapter { public ShareIntentAdapter() { super(); } @Override public int getCount() { return plainTextActivities != null? plainTextActivities.size() : 0; } @Override public ResolveInfo getItem(int position) { return plainTextActivities.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null) { view = mInflater.inflate(R.layout.griditem_share_us, parent, false); } else { view = convertView; } bindView(view, plainTextActivities.get(position)); return view; } private final void bindView(View view, ResolveInfo info) { TextView text = (TextView)view.findViewById(android.R.id.text1); ImageView icon = (ImageView)view.findViewById(android.R.id.icon); text.setText(info.activityInfo.applicationInfo.loadLabel(mContext.getPackageManager()).toString()); icon.setImageDrawable(info.activityInfo.applicationInfo.loadIcon(mContext.getPackageManager())); } } } 

Похоже, некоторые люди тоже хотят файлы макета. Вот они:

dialog_share_us_chooser.xml

 <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/resolver_grid" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center" android:clipToPadding="false" android:columnWidth="128dp" android:numColumns="4" android:padding="16dp" android:scrollbarStyle="outsideOverlay" /> 

Griditem_share_us.xml (из собственного проекта AOSP):

 <?xml version="1.0" encoding="utf-8"?> <!-- /* //device/apps/common/res/any/layout/resolve_list_item.xml ** ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="center" android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="match_parent" android:padding="16dp"> <!-- android:background="@android:drawable/activity_picker_bg" --> <!-- Activity icon when presenting dialog Size will be filled in by ResolverActivity --> <ImageView android:id="@android:id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" /> <!-- Activity name --> <TextView android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:minLines="2" android:maxLines="2" android:paddingLeft="4dip" android:paddingRight="4dip" /> <!-- android:textAppearance="android:attr/textAppearanceSmall" --> </LinearLayout> 

Если вы измените указанную выше строку на:

sharingIntent.setType("text/plain"); , Будет ли эта проблема решена?

Я думаю, что это text/plain , а не plain/text .

Ссылка от разработчиков Android:

MimeType A Тип MIME (т.е. текст / обычная)