2013-01-14 56 views
11

我一直在努力從我的應用程序發送文本到Twitter。如何使用Intent Action_send在Twitter上發帖?

下面的代碼可以顯示藍牙,Gmail,Facebook和Twitter等應用程序的列表,但是當我選擇Twitter時,它並不按照我的預期預先填充文本。

我知道在Facebook上這樣做有問題,但我必須做一些錯誤的事情,因爲它不會與Twitter合作。

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("text/plain"); 
intent.putExtra(Intent.EXTRA_TEXT, "Example Text"); 
startActivity(Intent.createChooser(intent, "Share Text")); 
+1

[該解決方案(HTTP://計算器.com/a/21186753/56285)會直接啓動Twitter官方應用程序(如果已安裝的話),或者開始與其他能夠發送推文的應用程序(例如瀏覽器)打開選擇器。 – Jonik

回答

42

我用我的這個代碼片段:

private void shareTwitter(String message) { 
    Intent tweetIntent = new Intent(Intent.ACTION_SEND); 
    tweetIntent.putExtra(Intent.EXTRA_TEXT, "This is a Test."); 
    tweetIntent.setType("text/plain"); 

    PackageManager packManager = getPackageManager(); 
    List<ResolveInfo> resolvedInfoList = packManager.queryIntentActivities(tweetIntent, PackageManager.MATCH_DEFAULT_ONLY); 

    boolean resolved = false; 
    for (ResolveInfo resolveInfo : resolvedInfoList) { 
     if (resolveInfo.activityInfo.packageName.startsWith("com.twitter.android")) { 
      tweetIntent.setClassName(
        resolveInfo.activityInfo.packageName, 
        resolveInfo.activityInfo.name); 
      resolved = true; 
      break; 
     } 
    } 
    if (resolved) { 
     startActivity(tweetIntent); 
    } else { 
     Intent i = new Intent(); 
     i.putExtra(Intent.EXTRA_TEXT, message); 
     i.setAction(Intent.ACTION_VIEW); 
     i.setData(Uri.parse("https://twitter.com/intent/tweet?text=" + urlEncode(message))); 
     startActivity(i); 
     Toast.makeText(this, "Twitter app isn't found", Toast.LENGTH_LONG).show(); 
    } 
} 

private String urlEncode(String s) { 
    try { 
     return URLEncoder.encode(s, "UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     Log.wtf(TAG, "UTF-8 should always be supported", e); 
     return ""; 
    } 
} 

希望它能幫助。

+2

這種方法的問題是它只允許官方的twitter應用程序。 – StackOverflowed

+0

感謝它的工作,因爲我想要的。 – Rahul

+0

@StackOverflowed,但我相信只有經常使用twitter的少數用戶沒有該應用程序,他們將共享內容。 – Sheychan

15

您可以簡單地打開帶有文字的網址,Twitter應用會執行此操作。 ;)

String url = "http://www.twitter.com/intent/tweet?url=YOURURL&text=YOURTEXT"; 
Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.parse(url)); 
startActivity(i); 

如果找不到twitter應用程序,它也會打開瀏覽器登錄tweet。

+0

謝謝,這很有用!我知道有一種方法可以實現這個功能,它可以顯示應用程序列表(twitter,fb,gmail等)和twitter的作品,因爲我在其他應用程序(Log Collector等)中看到了它。我並不想讓多個按鈕通過多個應用程序共享:s – user1966361

+2

這並不回答問題,它只是提供了一種使用Twitter發佈文本的方法。我在尋找Twitter作爲Intent Action_Send下的選項接收文本的結果。 – user1966361

7

試試這個,我用它和偉大的工作

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com/intent/tweet?text=....")); 
    startActivity(browserIntent);   
7

首先,你必須檢查是否安裝在設備上的Twitter的應用程序或不那麼Twitter上分享文字:

try 
    { 
     // Check if the Twitter app is installed on the phone. 
     getActivity().getPackageManager().getPackageInfo("com.twitter.android", 0); 
     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setClassName("com.twitter.android", "com.twitter.android.composer.ComposerActivity"); 
     intent.setType("text/plain"); 
     intent.putExtra(Intent.EXTRA_TEXT, "Your text"); 
     startActivity(intent); 

    } 
    catch (Exception e) 
    { 
     Toast.makeText(getActivity(),"Twitter is not installed on this device",Toast.LENGTH_LONG).show(); 

    } 
+0

此代碼引發安全異常:在Twitter上分享權限拒絕。 –

1

對於分享文字圖片推特,更多控制版本的代碼如下,您可以添加更多的方法與WhatsApp共享,Facebook ...這是官方應用程序,如果應用程序不存在,則不會打開瀏覽器。

public class IntentShareHelper { 

    public static void shareOnTwitter(AppCompatActivity appCompatActivity, String textBody, Uri fileUri) { 
     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setType("text/plain"); 
     intent.setPackage("com.twitter.android"); 
     intent.putExtra(Intent.EXTRA_TEXT,!TextUtils.isEmpty(textBody) ? textBody : ""); 

     if (fileUri != null) { 
      intent.putExtra(Intent.EXTRA_STREAM, fileUri); 
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      intent.setType("image/*"); 
     } 

     try { 
      appCompatActivity.startActivity(intent); 
     } catch (android.content.ActivityNotFoundException ex) { 
      ex.printStackTrace(); 
      showWarningDialog(appCompatActivity, appCompatActivity.getString(R.string.error_activity_not_found)); 
     } 
    } 

    public static void shareOnWhatsapp(AppCompatActivity appCompatActivity, String textBody, Uri fileUri){...} 

    private static void showWarningDialog(Context context, String message) { 
     new AlertDialog.Builder(context) 
       .setMessage(message) 
       .setNegativeButton(context.getString(R.string.close), new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }) 
       .setCancelable(true) 
       .create().show(); 
    } 
} 

爲了得到烏里從文件,請使用以下類:

public class UtilityFile { 
    public static @Nullable Uri getUriFromFile(Context context, @Nullable File file) { 
     if (file == null) 
      return null; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      try { 
       return FileProvider.getUriForFile(context, "com.my.package.fileprovider", file); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } else { 
      return Uri.fromFile(file); 
     } 
    } 

    // Returns the URI path to the Bitmap displayed in specified ImageView  
    public static Uri getLocalBitmapUri(Context context, ImageView imageView) { 
     Drawable drawable = imageView.getDrawable(); 
     Bitmap bmp = null; 
     if (drawable instanceof BitmapDrawable) { 
      bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); 
     } else { 
      return null; 
     } 
     // Store image to default external storage directory 
     Uri bmpUri = null; 
     try { 
      // Use methods on Context to access package-specific directories on external storage. 
      // This way, you don't need to request external read/write permission. 
      File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png"); 
      FileOutputStream out = new FileOutputStream(file); 
      bmp.compress(Bitmap.CompressFormat.PNG, 90, out); 
      out.close(); 

      bmpUri = getUriFromFile(context, file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return bmpUri; 
    }  
} 

對於寫FileProvider,使用此鏈接:https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents

相關問題