简体   繁体   中英

How can I tweet texts and images from an Android App in Kotlin?

What I would like to do

I would like to tweet text and image from an Android App.

I was able to put an image to tweet on a screen of app and the app can open tweet form via a button.

As a reference, I checked the following former question.

How to Share Image + Text together using ACTION_SEND in android?

Problem

Problem is set text and image data on the program are not appeared to the twitter.

It only show blank tweet form.

How can I move these text and image from the Android app to the tweet form?

Code

MainActivity.kt

package com.example.tweets

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import android.content.Intent
import android.net.Uri
import android.util.Log
import androidx.core.app.ShareCompat
import java.io.File
import android.R.attr.path
import android.graphics.BitmapFactory
import kotlinx.android.synthetic.main.activity_main.*
import androidx.core.app.ComponentActivity.ExtraData
import androidx.core.content.ContextCompat.getSystemService
import android.icu.lang.UCharacter.GraphemeClusterBreak.T
import java.io.IOException


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        try {resources.assets.open("sample.jpg").use { istream ->
            val bitmap = BitmapFactory.decodeStream(istream)
            sample.setImageBitmap(bitmap)
        }
        } catch (e: IOException) {
            e.printStackTrace()
        }


        val intentTweetButton: Button = findViewById(R.id.intentTweetButton)
        intentTweetButton.setOnClickListener {
            shareTwitter()
        }

        /*

        val shareCompatButton: Button = findViewById(R.id.shareCompatButton)
        shareCompatButton.setOnClickListener {
            shareCompat()
        }
        */
    }

    fun shareTwitter() {
        val message = "shareTwitter intent tweet"
        val bmpUri = Uri.parse("file://$path")
        try {
            val sharingIntent = Intent(Intent.ACTION_SEND)
            sharingIntent.setClassName("com.twitter.android", "com.twitter.android.PostActivity")
            val imageUri = Uri.parse("sample.jpg")
            sharingIntent.putExtra(Intent.EXTRA_TEXT, "Hello")
            sharingIntent.putExtra(Intent.EXTRA_STREAM, imageUri)
            sharingIntent.type = "image/jpeg"
            sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            startActivity(sharingIntent)
        }
        catch (e: Exception) {
            Log.e("In Exception", "Comes here")
            val i = Intent()
            i.putExtra(Intent.EXTRA_TEXT, message)
            i.action = Intent.ACTION_VIEW
            i.data = Uri.parse("https://mobile.twitter.com/compose/tweet")
            startActivity(i)
        }

    }

    /*

    fun shareCompat() {
        val message = "shareCompat"
        val builder = ShareCompat.IntentBuilder.from(this)
        builder.setChooserTitle("Choose App")
        builder.setText(message)
        builder.setType("text/plain")
        builder.addStream(Uri.fromFile(File("sample.jpg")))
        builder.setType("image/jpg")
        builder.startChooser()
    }
     */
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/sample"
        android:scaleType="centerCrop"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/img_description"
        tools:ignore="InvalidId" />

    <Button
        android:id="@+id/intentTweetButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:text="intent tweet"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <!--
    <Button
        android:id="@+id/shareCompatButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:text="ShareCompat"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/intentTweetButton" />
     -->

</androidx.constraintlayout.widget.ConstraintLayout>

What I tried to do

I tried to use share compat instead of intent , but it didn't work neither.

In addition to that, share compat is only available for user who have downloaded Twitter app on the phones, so I prefer to use intent to tweet text and image from the Android app.

The image is located on app/assets/sample.jpg .

Environment

Android Studio 3.5.3

Kotlin plugin 1.3.50

try this

 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 "";
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM