program tip

Twitter 애플리케이션 용 Android Intent

radiobox 2020. 11. 29. 10:11
반응형

Twitter 애플리케이션 용 Android Intent


intent.createChooser내 휴대폰에서 내 트위터 앱만 표시하는 애플리케이션 목록 ( ) 을 표시 할 수 있습니까 (HTC peep (htc hero) 또는 twitdroid). 나는 그것을 시도했지만 intent.settype("application/twitter")트위터 용 앱을 찾지 못하고 내 메일 앱만 표시합니다.

감사합니다,

Wouter


귀하의 사용자가 지금은 영원히 트위터에만 게시하기를 원할 수 있습니다.

나는 당신의 사용자가 사람들에게 정보를 보내고 싶어 할 가능성이 더 높다고 생각하고, Twitter가 하나의 가능성입니다. 하지만 문자 메시지 나 이메일 등을 보내고 싶을 수도 있습니다.

이 경우 여기에ACTION_SEND 설명 된 대로을 사용 하십시오 . 특히 Twidroid는를 지원 ACTION_SEND하므로 사용 가능한 전달 메커니즘 목록에 표시됩니다.


내가 원하는 것을 정확히 수행하는 솔루션을 아직 보지 못했기 때문에 이것을 게시하고 있습니다.

이렇게하면 주로 공식 Twitter 앱시작됩니다. 설치되어 있지 않은 경우 '다음을 사용하여 작업 완료'대화 상자 ( 예 :이 )를 표시하거나 웹 브라우저를 직접 시작합니다.

twitter.com URL의 다양한 매개 변수 목록은 트윗 버튼 문서를 참조하세요 . 매개 변수 값 URL 인코딩 해야합니다. (이 코드는 특히 URL을 트윗하기위한 것입니다. 원하지 않으면 url매개 변수를 생략하세요 .)

// Create intent using ACTION_VIEW and a normal Twitter url:
String tweetUrl = String.format("https://twitter.com/intent/tweet?text=%s&url=%s",
        urlEncode("Tweet text"), 
        urlEncode("https://www.google.fi/"));
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(tweetUrl));

// Narrow down to official Twitter app, if available:
List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
    if (info.activityInfo.packageName.toLowerCase().startsWith("com.twitter")) {
        intent.setPackage(info.activityInfo.packageName);
    }
}

startActivity(intent);

(어딘가에 "StringUtils"와 같은 약간의 유틸리티가 있으면 URL 인코딩이 더 깨끗합니다.)

public static String urlEncode(String s) {
    try {
        return URLEncoder.encode(s, "UTF-8");
    }
    catch (UnsupportedEncodingException e) {
        Log.wtf(TAG, "UTF-8 should always be supported", e);
        throw new RuntimeException("URLEncoder.encode() failed for " + s);
    }
}

예를 들어 Nexus 7 기기 에서 공식 Twitter 앱바로 열립니다 .

여기에 이미지 설명 입력

공식 Twitter 앱이 설치되어 있지 않고 사용자가 Chrome을 선택하거나 자동으로 열리는 경우 (인 텐트를 처리 할 수있는 유일한 앱) :

여기에 이미지 설명 입력


이전에 게시 된 솔루션을 사용하면 첫 번째 트위터 앱에 직접 게시 할 수 있습니다. 트위터 앱 목록을 표시하려면 (하나 이상있는 경우) 원하는 Itents 만 표시하도록 Intent.createChooser를 사용자 정의 할 수 있습니다.

트릭은 createChoose에서 생성 된 기본 목록에 EXTRA_INITIAL_INTENTS를 추가하고 목록에서 다른 인 텐트를 제거하는 것입니다.

내 이메일 앱만 표시하는 선택기를 만드는이 샘플을보십시오. 제 경우에는 Gmail, YahooMail 및 기본 메일의 세 가지 메일이 나타납니다.

private void share(String nameApp, String imagePath) {
    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_TEXT,     "My body of post/email");
                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);
    }
}

다음과 같이 실행할 수 있습니다. share ( "twi", "/sdcard/dcim/Camera/photo.jpg");

이것은 게시물을 기반으로합니다 : 설치된 Android 패키지 이름을 기반으로 의도 선택기의 사용자 지정 필터링


이 질문은 조금 오래되었지만 비슷한 문제를 막 발견했기 때문에 다른 사람들에게도 여전히 관심이있을 수 있습니다. 먼저 Peter가 언급했듯이 의도를 만드십시오.

Intent tweetIntent = new Intent(Intent.ACTION_SEND);
tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
tweetIntent.setType("application/twitter");

"application/twitter" is in fact a known content type, see here. Now, when you try to start an activity with this intent, it will show all sorts of apps that are not really Twitter clients, but want a piece of the action. As already mentioned in a couple of the "why do you even want to do that?" sort of answers, some users may find that useful. On the other hand, if I have a button in my app that says "Tweet this!", the user would very much expect this to bring up a Twitter client.

Which means that instead of just launching an activity, we need to filter out the ones that are appropriate:

PackageManager pm = getPackageManager();
List<ResolveInfo> lract 
= pm.queryIntentActivities(tweetIntent,
    PackageManager.MATCH_DEFAULT_ONLY);

boolean resolved = false;

for(ResolveInfo ri: lract)
{
    if(ri.activityInfo.name.endsWith(".SendTweet"))
    {
        tweetIntent.setClassName(ri.activityInfo.packageName,
                        ri.activityInfo.name);
        resolved = true;
        break;
    }
}

You would need to experiment a bit with the different providers, but if the name ends in ".SendTweet" you are pretty safe (this is the activity name in Twidroyd). You can also check your debugger for package names you want to use and adjust the string comparison accordingly (i.e. Twidroyd uses "com.twidroid.*").

In this simple example we just pick the first matching activity that we find. This brings up the Twitter client directly, without the user having to make any choices. If there are no proper Twitter clients, we revert to the standard activity chooser:

startActivity(resolved ? tweetIntent :
    Intent.createChooser(tweetIntent, "Choose one"));

You could expand the code and take into account the case that there is more than one Twitter client, when you may want to create your own chooser dialog from all the activity names you find.


These answers are all overly complex.

If you just do a normal url Intent that does to Twitter.com, you'll get this screen:

여기에 이미지 설명 입력

which gives you the option of going to the website if you have no Twitter apps installed.

String url = "https://twitter.com/intent/tweet?source=webclient&text=TWEET+THIS!";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

Either

  • You start an activity with an Intent with action Intent.ACTION_SEND and the text/plain MIME type. You'll have all applications that support sending text. That should be any twitter client, as well as Gmail, dropbox, etc.
  • Or, you try to look up for the specific action of every client you are aware of, like "com.twitter.android.PostActivity" for the official client. That will point to this client, and that is unlikely to be a complete list.
  • Or, you start with the second point, and fall back on the first...

아니. 인 텐트 유형은 image/png또는 application/pdf, 즉 파일 유형이고 createChooser를 사용하면 기본적으로이 파일 유형을 열 수있는 앱을 묻는 것입니다.

이제 application/twitter열 수 있는 파일 같은 것이 없으므로 작동하지 않습니다. 나는 당신이 원하는 것을 달성 할 수있는 다른 방법을 알지 못합니다.


에서 http://twidroid.com/plugins/

Twidroid의 ACTION_SEND 의도

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is a sample message via Public Intent"); 
sendIntent.setType("application/twitter");   
startActivity(Intent.createChooser(sendIntent, null)); 

"billynomates"답변을 사용했고 "URLEncoder.encode (,"UTF-8 ")"함수를 사용하여 해시 태그를 사용할 수있었습니다. 해시 태그가 제대로 표시되었습니다.

String originalMessage = "some message #MESSAGE";

String originalMessageEscaped = null;
try {
   originalMessageEscaped = String.format(
    "https://twitter.com/intent/tweet?source=webclient&text=%s",
    URLEncoder.encode(originalMessage, "UTF-8"));
} catch (UnsupportedEncodingException e) {
   e.printStackTrace();
}

if(originalMessageEscaped != null) {
   Intent i = new Intent(Intent.ACTION_VIEW);
   i.setData(Uri.parse(originalMessageEscaped));
   startActivity(i);
}
else {
   // Some Error
}

참고 URL : https://stackoverflow.com/questions/2077008/android-intent-for-twitter-application

반응형