2012年10月19日金曜日

【Android】twiccaに画像インテントを投げてもアップロードできない

twicca
Androidのtwitterクライアントで100万ダウンロード以上,45,000レビューあって評価4.5という人気アプリ(2012/10月現在)
そのtwiccaに自分のアプリから画像をインテントで投げてtwiccaからつぶやいてみたい.
そういう需要があるかもしれない.

しかし,twiccaへのインテントの投げ方はどうやらお作法があるらしい.
普通に作ってインテントを投げてもtwiccaは画像をアップロードさせてくれない.


まず1点.
twiccaへ投げるmimetypeはちゃんとファイルに即した形式で投げる必要がある.
"image/*"などというワイルドカードは避けるべきである.
twiccaではこんなインテントは受けた瞬間に落ちるようだ.


twiccaへ投げるお作法でもう1点.

たとえばこんなかんじでtwiccaへインテントを投げる

File _file;
String _mimetype;
///////////////////////// 別のところで_fileと_mimetypeを設定

private void sendIntent () {
Uri uri = Uri.fromFile(_file);

Intent intent = new Intent (Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType((_mimetype != "") ? _mimetype : "image/*");
startActivity(intent);
}

やってることは単純.
ファイルからURIを取得してそれをインテントとして投げている.

他のだいたいのアプリはこれできちんと受け取ってくれるのだ.
でもtwiccaはクリップボードに画像がありますよマークは出るのだが
アップロードボタンを押しても反応しない.


さて何故でしょう.
ちなみにAndroid標準ギャラリーから送った画像はtwiccaは正常にアップロード出来て
開発者の友達,ESイメージブラウザから送った画像は今回と同様にアップロード出来ない.


ここから推測するに,twiccaはcontentスキーマしか処理していない.
contentスキーマというとContentProvider用のスキーマ.
URLがcontent://から始まる.

一方,上のサンプルでtwiccaへ投げたURLはFileパス.
FileパスのURLはfile:///から始まるのである.

ちなみに同一画像についてギャラリーとESイメージブラウザからインテントを投げてもらって
受け取ったURLが以下のとおりである.

// ギャラリー
URI: content://media/external/images/media/2003
// ESイメージブラウザ
URI: file:///mnt/sdcard/DCIM/Camera/20121015_200741.jpg

同一画像だが,全く違うURLをくれた.


あくまで俺の勝手な推論だが,
twiccaはcontentスキーマしか処理してないと考えられる.

画像を受け取るアプリケーションの理想としては
他アプリからインテントを受け取ったときに
URLの先頭を確認してcontentから始まっていたらfile形式のURLに変換するか
もしくはfileから始まっていたらcontent形式に変換するかをして
両URLに対応するのが望ましいと思うが,実際にcontentスキーマしか対応していないのなら
送り側がfileスキーマからcontentスキーマに変換してやるしかない.

しかしそうすると逆にfileしか対応していないアプリに対してエラーを出させることとなる.
投げる側は1つのURLしか投げられない.


ちなみにcontentとfileの相互変換については他サイト様を参考にされたし.
http://yagni.jp/android/interconversion_between_file_and_content


0 件のコメント:

コメントを投稿