java - 如何在 Kotlin 中通过 Android 应用发布文本和图像?
问题描述
我想做什么
我想从 Android 应用程序中发布文本和图像。
我能够在应用程序的屏幕上放置一张要推文的图像,并且该应用程序可以通过一个按钮打开推文表单。
作为参考,我检查了以下前一个问题。
如何在 android 中使用 ACTION_SEND 共享图像 + 文本?
问题
问题是程序上设置的文本和图像数据没有出现在推特上。
它只显示空白推文形式。
如何将这些文本和图像从 Android 应用程序移动到推文表单?
代码
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>
我试图做的
我尝试使用share compat
而不是intent
,但它也没有工作。
除此之外, share compat
仅适用于在手机上下载了 Twitter 应用程序的用户,因此我更喜欢使用intent
来自 Android 应用程序的推文和图像。
该图像位于app/assets/sample.jpg
.
环境
安卓工作室 3.5.3
Kotlin 插件 1.3.50
解决方案
试试这个
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 "";
}
}
推荐阅读
- qt - 元素少于路径点的 PathView
- android - 运行 android 应用程序时,nativescript-permissions 出错
- python - 跟踪主要任务
- html - 复选框在 jquery 的对话框中不可见
- powershell - 从特定文件夹中的命令行调用提升的 PowerShell 并运行 PowerShell 脚本
- bash - 如何从`git describe --all`中提取标签名称,无论它是带注释的还是轻量级的
- c# - 如果服务器重新启动,我可以从客户端请求 IdentityServer4 令牌吗?
- reactjs - React Hooks: useEffect withdependecy 在组件挂载时也被调用
- c++ - ID:danglingTemporaryLifetime 使用指向临时的指针。:C:有条件地更改函数内部 const char 函数参数的值
- sql - 分组依据比选择的字段少