質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

2回答

4069閲覧

【Android】ギャラリーで画像複数選択→そのままツイートしたいのですが・・・

nasulrj

総合スコア38

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

1クリップ

投稿2016/04/21 10:21

ご無沙汰しております。
Twitterのクライアントアプリを作成しています。
作っている最中表題でつまづき色々調べているのですが
これだという解決策がないのでこちらに質問致します。

Android OSは4.4.2以降を想定して作っています。
twitter4jを用いて作成しています。
ギャラリー画像複数選択→ツイートの部分がどうしてもうまく行きません。
ツイートの前にログキャットでエラー出て強制終了しました。
何故nullを吐き出すか原因がよく分かりません。
そこからのツイートですが、選択した状態の画像をどうtweet();の部分に埋め込めがいいのか分かりません。
ご教示願います。

【ソース】
TwitterActivity.java
ボタンを押したらギャラリーに飛び画像を選択
その後ツイートボタンを押すとタイムラインに飛ぶイメージです。

Java

1package android.example.shutwitter; 2 3import java.io.FileDescriptor; 4import java.io.IOException; 5import java.util.ArrayList; 6import java.util.List; 7 8import android.app.Activity; 9import android.content.ClipData; 10import android.content.Intent; 11import android.graphics.Bitmap; 12import android.graphics.BitmapFactory; 13import android.net.Uri; 14import android.os.AsyncTask; 15import android.os.Bundle; 16import android.os.ParcelFileDescriptor; 17import android.util.Log; 18import android.view.Menu; 19import android.view.MenuItem; 20import android.view.View; 21import android.widget.Button; 22import android.widget.EditText; 23import android.widget.ImageView; 24import android.widget.Toast; 25import twitter4j.Twitter; 26import twitter4j.TwitterException; 27 28public class TweetActivity extends Activity { 29 30 private EditText mInputText; 31 private Twitter mTwitter; 32 private Button mGazou; 33 private ImageView imageView,imageView2,imageView3,imageView4; 34 35 private static final int RESULT_PICK_IMAGEFILE = 1001; 36 37 @Override 38 protected void onCreate(Bundle savedInstanceState) { 39 super.onCreate(savedInstanceState); 40 setContentView(R.layout.new_tweet); 41 42 mTwitter = TwitterUtils.getTwitterInstance(this); 43 //Twitter文字入力 44 mInputText = (EditText) findViewById(R.id.input_text); 45 //Twitter画像選択(ギャラリーから) 46 mGazou = (Button)findViewById(R.id.button1); 47 mGazou.setOnClickListener(new View.OnClickListener() { 48 @Override 49 public void onClick(View v) { 50 51 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 52 intent.addCategory(Intent.CATEGORY_OPENABLE); 53 intent.setType("image/*"); 54 55 startActivityForResult(intent, RESULT_PICK_IMAGEFILE); 56 57 } 58 59 60 61 }); 62 63 findViewById(R.id.action_tweet).setOnClickListener(new View.OnClickListener() { 64 @Override 65 public void onClick(View v) { 66 tweet(); 67 68 } 69 }); 70 } 71 72 @Override 73 public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 74 imageView=(ImageView) findViewById(R.id.imageView1); 75 imageView2=(ImageView) findViewById(R.id.imageView2); 76 imageView3=(ImageView) findViewById(R.id.imageView3); 77 imageView4=(ImageView) findViewById(R.id.imageView4); 78 79 if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == Activity.RESULT_OK) { 80 Uri uri = null; 81 if (resultData != null) { 82 83 uri = resultData.getData(); 84 if(uri!=null){ 85 86 87 //複数選択 88 ClipData clipData = resultData.getClipData(); 89 List list = new ArrayList(); 90 Bitmap bmp =null; 91 92 for( int i = 0; i < clipData.getItemCount(); i ++ ){ 93 ClipData.Item item = clipData.getItemAt(i); 94 Uri multi_uri = item.getUri(); 95 try { 96 bmp = getBitmapFromUri(multi_uri); 97 } catch (IOException e) { 98 // TODO 自動生成された catch ブロック 99 e.printStackTrace(); 100 } 101 list.add(bmp); 102 } 103 Bitmap[] multi_bmp = ( Bitmap[] )list.toArray( new Bitmap[0] ); 104 105 switch(clipData.getItemCount()){ 106 case 1: 107 imageView.setImageBitmap(multi_bmp[0]); 108 imageView2.setVisibility(View.GONE); 109 imageView3.setVisibility(View.GONE); 110 imageView4.setVisibility(View.GONE); 111 break; 112 case 2: 113 imageView.setImageBitmap(multi_bmp[0]); 114 imageView2.setImageBitmap(multi_bmp[1]); 115 imageView3.setVisibility(View.GONE); 116 imageView4.setVisibility(View.GONE); 117 break; 118 case 3: 119 imageView.setImageBitmap(multi_bmp[0]); 120 imageView2.setImageBitmap(multi_bmp[1]); 121 imageView3.setImageBitmap(multi_bmp[2]); 122 imageView4.setVisibility(View.GONE); 123 break; 124 case 4: 125 imageView.setImageBitmap(multi_bmp[0]); 126 imageView2.setImageBitmap(multi_bmp[1]); 127 imageView3.setImageBitmap(multi_bmp[2]); 128 imageView4.setImageBitmap(multi_bmp[3]); 129 break; 130 default: 131 imageView.setVisibility(View.GONE); 132 imageView2.setVisibility(View.GONE); 133 imageView3.setVisibility(View.GONE); 134 imageView4.setVisibility(View.GONE); 135 break; 136 } 137 138 } 139 140 Log.i("", "Uri: " + uri.toString()); 141 142 } 143 } 144 145 } 146 147 148 149 private Bitmap getBitmapFromUri(Uri uri) throws IOException { 150 ParcelFileDescriptor parcelFileDescriptor = 151 getContentResolver().openFileDescriptor(uri, "r"); 152 FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 153 Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); 154 parcelFileDescriptor.close(); 155 return image; 156 } 157 158 159 160 161 162 @Override 163 public boolean onCreateOptionsMenu(Menu menu) { 164 // Inflate the menu; this adds items to the action bar if it is present. 165 getMenuInflater().inflate(R.menu.new_tweet_menu, menu); 166 return true; 167 } 168 169 @Override 170 public boolean onOptionsItemSelected(MenuItem item) { 171 // Handle action bar item clicks here. The action bar will 172 // automatically handle clicks on the Home/Up button, so long 173 // as you specify a parent activity in AndroidManifest.xml. 174 switch (item.getItemId()) { 175 case R.id.menu_not: 176 Intent intent = new Intent(this, MainActivity.class); 177 startActivity(intent); 178 finish(); 179 return true; 180 } 181 return super.onOptionsItemSelected(item); 182 } 183 184 185 private void tweet() { 186 AsyncTask<String, Void, Boolean> task = new AsyncTask<String, Void, Boolean>() { 187 @Override 188 protected Boolean doInBackground(String... params) { 189 try { 190 191 mTwitter.updateStatus(params[0]); 192 return true; 193 } catch (TwitterException e) { 194 e.printStackTrace(); 195 return false; 196 } 197 } 198 199 @Override 200 protected void onPostExecute(Boolean result) { 201 if (result) { 202 showToast("ツイートが完了しました!"); 203 showToast("×ボタンを押して元の画面に戻ってね"); 204 mInputText.setText(""); 205 206 } else { 207 showToast("ツイートに失敗しました。。。"); 208 } 209 } 210 }; 211 task.execute(mInputText.getText().toString()); 212 } 213 214 private void showToast(String text) { 215 Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); 216 } 217 218 219}

【LOGCAT】

logcat

104-21 05:27:43.157: E/AndroidRuntime(3458): FATAL EXCEPTION: main 204-21 05:27:43.157: E/AndroidRuntime(3458): Process: android.example.shutwitter, PID: 3458 304-21 05:27:43.157: E/AndroidRuntime(3458): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1001, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:31 flg=0x43 }} to activity {android.example.shutwitter/android.example.shutwitter.TweetActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.ClipData.getItemCount()' on a null object reference

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

回答欄を間違えました。

投稿2016/04/22 04:16

編集2016/04/22 04:22
yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasulrj

2016/04/22 04:34

まさしくそのとおりだと思います。 どのようにコードを修正したらいいのか分かりますでしょうか?
nasulrj

2016/04/22 08:11

有難うございます! 複数選択して画面に選んだ画像の反映に成功しました。 単体の分は見本のサイトがあるのでそちらを見ながら作っていきます。 もう一つお願いがあるのですがこの後画像付きでツイートを実装のアドバイスいただけると嬉しい限りです。
guest

0

ベストアンサー

下記のコードを追加してみてください。

Java

1intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

投稿2016/04/21 18:47

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasulrj

2016/04/22 01:55

リプライ有難うございます。 画像の複数選択することができました。 大変恐縮ですが、それ以降プログラムが実行されることはなくエラーで落ちてしまいます。
yona

2016/04/22 02:08

どの行で落ちているのかわかりますか? わからないなら下記を行ってください。 ActivityForResultの先頭にブレークポイントを設置し、ブレークポイントで停止した後にステップ実行してください。
nasulrj

2016/04/22 03:14

有難うございます┏○))ペコり 落ちている箇所ですが、 画像を1枚選択すると @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { imageView=(ImageView) findViewById(R.id.imageView1); imageView2=(ImageView) findViewById(R.id.imageView2); imageView3=(ImageView) findViewById(R.id.imageView3); imageView4=(ImageView) findViewById(R.id.imageView4); if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == Activity.RESULT_OK) { Uri uri = null; if (resultData != null) { uri = resultData.getData(); Log.i("", "Uri: " + uri.toString()); //----------------ここで落ちてます---------------------// //Error: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.ClipData.getItemCount()' on a null object reference if(uri!=null){ で落ち、 複数枚選択すると、Log.i("", "Uri: " + uri.toString());の部分で落ちてます。
yona

2016/04/22 04:22

つまり、単一選択と複数選択でIntentの中に入っているデータが異なることに対して、貴方のコードが対応できていないようですね。 単一選択 getData()はURIを返すが、getClipDataはnullを返す。 複数選択(下記は推測です。) getData()はnullを返すが、getClipData()はClipDataを返す。
yona

2016/04/22 05:21

上の2つの条件をそのままif文にすればいいと思いますよ。
yona

2016/04/22 08:35

そちらの方は何が問題になっているのかがわからないので回答できません。 また、1つの質問投稿に複数の関連しない質問を込めるのはよくないと思いますよ。
nasulrj

2016/04/22 10:04

申し訳ございません、以後気をつけます。 別途質問します。 丁寧に有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問