2014-03-29 88 views
2

我正在創建一個Android應用程序,允許用戶創建推文,然後在Twitter中打開它們,以便他們發佈推文。我使用下面的代碼來獲得他們所輸入文本,並將其發送到Twitter:百分號崩潰Twitter應用程序

String tweetUrl = "https://twitter.com/intent/tweet?text=" + URLEncoder.encode(mTweetTextBox.getText().toString()); 
Uri uri = Uri.parse(tweetUrl); 
startActivity(new Intent(Intent.ACTION_VIEW, uri)); 

這一切似乎都在編碼特殊字符,當用戶輸入一個百分號除方面很好地工作。這會導致Twitter應用在選擇使用Twitter時崩潰,但如果他們選擇在Chrome中打開推文,則可以正常工作。任何想法可能是什麼問題或如何解決這個問題?

這是控制檯輸出:

03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.ActivityThread.access$800(ActivityThread.java:139) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.os.Handler.dispatchMessage(Handler.java:102) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.os.Looper.loop(Looper.java:136) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.ActivityThread.main(ActivityThread.java:5102) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at java.lang.reflect.Method.invokeNative(Native Method) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at java.lang.reflect.Method.invoke(Method.java:515) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at dalvik.system.NativeStart.main(Native Method) 
03-29 12:50:12.705: E/AndroidRuntime(24458): Caused by: java.lang.IllegalArgumentException: Invalid % sequence at 5: test % tweet 
03-29 12:50:12.705: E/AndroidRuntime(24458): at libcore.net.UriCodec.decode(UriCodec.java:169) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at java.net.URLDecoder.decode(URLDecoder.java:60) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at com.twitter.library.util.Util.b(Twttr:369) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at com.twitter.android.UrlInterpreterActivity.c(Twttr:631) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at com.twitter.android.UrlInterpreterActivity.b(Twttr:237) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at com.twitter.android.client.BaseFragmentActivity.onCreate(Twttr:313) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.Activity.performCreate(Activity.java:5248) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) 
03-29 12:50:12.705: E/AndroidRuntime(24458): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173) 
03-29 12:50:12.705: E/AndroidRuntime(24458): ... 11 more 

顯然它引起IllegalArgumentException但我不知道怎麼去解決這個問題。

回答

2

The percent sign is used to encode special characters。如果您想發推文「test%tweet」,您可以使用special percent encoding代替:

try { 
     final String tweetUrl = "https://twitter.com/intent/tweet?text=" 
       + URLEncoder.encode("test %25 tweet", "UTF-8"); 
     final Uri uri = Uri.parse(tweetUrl); 
     startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
    } catch (final UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
+0

This Works,thanks!只是想知道爲什麼'URLEncoder.encode'不會自動編碼百分號? –

+1

嗯,它確實如此。如果你調用了'System.out.println(URLEncoder.encode(「test%tweet」,「UTF-8」))''你會發現它的編碼是正確的,但我不能說爲什麼它不能在你的案件。這個錯誤似乎發生在Twitter的結尾,所以我猜他們正在做一些事情。 – adneal

+0

@ SamG-H我不知道爲什麼我在我的文章中沒有提到,我想我更關注解決它。你正確使用'URLEncoder.encode'。 – adneal