63472


### 実現したいこと

Androidアプリから、画面のスクリーンショットを保存して、アプリから直接Twitterに画像をシェアする機能を実現したいです。

現状は、開発しているAndroidアプリからTwitterに移動はできるのですが、画像が自動的にTwitterに移動できていないので、プログラムをどのように修正すればいいかアドバイスをいただきたいです。

### 試したこと

`ShareCompat`に関して調べて、teratailで未回答の「[Androidアプリで画像をTwitterにシェアしたい](https://teratail.com/questions/210893)」という質問を見つけ、記載されていたコードを動かしてみました。

別の記事で、[iOSとAndroidのTweet機能を組み込む方法について書かれた記事](http://www.bitz.co.jp/weblog/?date=201908)を見つけて、双方を組み合わせようとしています。

### 現状の問題点

アプリがインストールされていなくても、Webブラウザ経由でTwitterにログインもしくは新規登録できるようになりましたが、文字や画像などアプリから共有したいコンテンツをTwitterに移行できていない状態です。

### 現在のコード

MainActivity.kt

[code]

    package com.example.snsshare
    
    import android.graphics.Color
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.TextView
    import android.widget.SeekBar
    import kotlinx.android.synthetic.main.activity_main.*
    import android.widget.SeekBar.OnSeekBarChangeListener
    import android.content.Intent
    import android.net.Uri
    import android.util.Log
    import android.widget.Button
    import androidx.core.app.ShareCompat
    import androidx.core.content.FileProvider
    import java.io.File
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            //intent button
            val intentTweetButton: Button = findViewById(R.id.intentTweetButton)
            intentTweetButton.setOnClickListener {
                shareTwitter()
            }
    
            seekbar.setOnSeekBarChangeListener(
                object : SeekBar.OnSeekBarChangeListener {
                    //ツマミがドラッグされると呼ばれる
                    override fun onProgressChanged(
                        seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                        // 68 % のようにフォーマト、
                        // この場合、Locale.USが汎用的に推奨される
    
                        background_view.setBackgroundColor(Color.rgb(progress,200,255 - progress))
                    }
    
                    override fun onStartTrackingTouch(seekBar: SeekBar) {
                        // ツマミがタッチされた時に呼ばれる
                    }
    
                    override fun onStopTrackingTouch(seekBar: SeekBar) {
                        // ツマミがリリースされた時に呼ばれる
                    }
    
                })
    
            share_button.setOnClickListener() {
                showShareChooser()
            }
        }
    
        // share intentの実装
        fun shareTwitter() {
            val message = "shareTwitter intent tweet"
            try {
                val sharingIntent = Intent(Intent.ACTION_SEND)
                sharingIntent.setClassName("com.twitter.android", "com.twitter.android.PostActivity")
                sharingIntent.putExtra(Intent.EXTRA_TEXT, message)
                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)
            }
    
        }
    
        //share compatの実装
        private fun showShareChooser() {
    
            val chooserTitle = "共有方法"
            val subject = "メールの件名"
            val text = "アプリタイトル"
    
            val builder = ShareCompat.IntentBuilder.from(this)
            builder.setChooserTitle(chooserTitle) // シェアする時のタイトル
                .setSubject(subject) // 件名。使われ方はシェアされた側のアプリによる
                .setText(text) // 本文。使われ方はシェアされた側のアプリによる
                .setType("text/plain") // ストリームで指定したファイルのMIMEタイプ
    
            // 結果を受け取らなくても良い場合は、ビルダーからそのまま開始できる
            builder.startChooser()
        }
    
    }
    
[/code]

activity_main.xml

[code]

    <?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">
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <ImageView
                android:id="@+id/background_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical"
            android:padding="20dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:context=".MainActivity">
    
            <SeekBar
                android:id="@+id/seekbar"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="20dp"
                android:background="#ccc"
                android:max="255"/>
    
            <Button
                android:id="@+id/share_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="ShareCompat"/>
    
            <Button
                android:id="@+id/intentTweetButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="intent tweet" />
    
        </LinearLayout>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
[/code]

### 追記

[iOSとAndroidのTweet機能を組み込む方法について書かれた記事](http://www.bitz.co.jp/weblog/?date=201908)では、share
intent（アプリがスマホに入っていなくてもWebブラウザに移行してツイート編集画面を立ち上げる）を実行した場合、

[code]

    val message = "shareTwitter intent tweet"
    
[/code]

がツイート編集画面で記入された上で、ツイッターが立ち上がっていましたが、現行のコードを実行してもエミュレーターでは何も記入されていないままでツイート投稿のための編集画面が立ち上がります。

### 開発環境

Android Studio 3.5.3


CC BY-SA 4.0
2020-02-20T05:40:08.327
63202
2020-03-02T16:07:23.687
2020-03-02T16:07:23.687
3060
question
java android twitter kotlin
Androidアプリから画像をSNSシェアをする機能を実装する時に、エラーが出ないので修正点がわからない


どうもこんにちは。こちらが参考になるのではないでしょうか。

[SDKを使わないでSNSに投稿する -
Qiita](https://qiita.com/le_skamba/items/c9810a0e6df27097d502)

[code]

    val builder = ShareCompat.IntentBuilder.from(this)
        builder.setChooserTitle("title");
        builder.setText("message")
        builder.setType("image/jpg")
        builder.addStream(Uri.fromFile(File("画像のパス")))
        builder.startChooser()
    
[/code]


CC BY-SA 4.0
2020-02-25T07:43:50.040
63342
2020-02-25T08:25:59.553
2020-02-25T08:25:59.553
3060
37958
63202
answer


Yahooの知恵袋のほうで回答した者です。

teratailの質問者またはiOSとAndroidのTweet機能を組み込む方法のGitHubところのソースコードをみました。NPPさんのプログラムを走らせてみました。  
感想はTwitterと連携が取れていない印象がある。問題を感じたところはshareTwitter()メソッドのtryの部分とshowShareChooser()メソッドです。  
連携が取れていないために移行できていないではないでしょうか。  
shareTwitter()メソッドのtryの部分で気になることがあります。

ネットで拾った情報が正しければ  
旧)com.twitter.android.PostActivityから  
新)com.twitter.applib.PostActivityに変更なっています。  
<https://www.manongdao.com/q-657607.html>  
<https://www.ojit.com/article/654030>  
ただ、新しいほうで実行するとアプリが落ちます。

お気づきになっているかどうかわかりませんが  
iOSとAndroidのTweet機能を組み込む方法のサイトを見ると  
下から２番目のiOSの画像にはDialogの表示画像がある。

【Android】ShareCompatを使って簡単にシェアボタンを実装しよう  
<https://qiita.com/ryokosuge/items/1d016043bf9f20828491>

ここのサイトのソースコードの中身にも  
// アプリ一覧が表示されるDialogのタイトルの設定  
という言葉があります。

つまり、showShareChooser()メソッドはDialogやオプションメニュー  
などの形で表示する目的のメソッドと思います。

以下は具体例  
Android Tips #35 ShareCompat で簡単に共有アクションをつくる  
<https://dev.classmethod.jp/smartphone/android/android-tips-35-sharecompat/>


CC BY-SA 4.0
2020-03-01T09:50:08.443
63472
2020-03-01T09:50:08.443
38021
63202
answer