2015/03/18 このエントリーをはてなブックマークに追加 はてなブックマーク - 【Android】Intentを発行してファイルパスを取得する

【Android】Intentを発行してファイルパスを取得する

カテゴリ:








Android端末からファイルを選択してファイルパスを取得したいと思った時、
どうやろうかなぁって思い調べたらこの記事を見つけました。

Androidでファイル選択ダイアログができなかったのでIntentでファイル選択アプリを呼び出す




この記事見た時になるほどなぁと思ったんですが、「あれこれする」ってどうすりゃいいんだ、と。
勝手に続きを書こうかなと思います。








・Android端末から外部のIntentを発行してFileエクスプローラのアプリを起動する(Google Driveとか)
・onActivityResultからファイルパスを取得する
・InputStreamを生成する



いたってシンプルです。





ファイルエクスプローラーを開き、指定したファイルパスを取得するソースは以下のとおりです。

    // 識別用のコード
    private final static int CHOSE_FILE_CODE = "12345";
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("file/*");
        startActivityForResult(intent, CHOSE_FILE_CODE);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        try {
            if (requestCode == CHOSE_FILE_CODE && resultCode == RESULT_OK) {
                String filePath = data.getDataString().replace("file://", "");
                String decodedfilePath = URLDecoder.decode(filePath, "utf-8");
                imageText.setText(decodedfilePath);
            }
        } catch (UnsupportedEncodingException e) {
                // いい感じに例外処理
        }
    }



こんな感じでエクスプローラー向けにIntentが飛びます。任意のアプリでファイルを指定すると
onActivityResultイベントが発生し、ファイルの情報をIntentから取得できます。




Fileインスタンスの取得やInputStreamの生成はこんな感じです。Java SE6が主流なAndroid。多分。

File file = new File(decodeFilePath);
FileInputStream fis = new FileInputStream(file);






IntentからgetDataStringで取得できるというのがまず分かりませんでした。
これが正解っぽい。
file://という文字列はいらないです。接頭辞としてfile://から始まり、端末のフルパスが続くようなので、
先頭の部分を置換で切り取ってます(もしかしたら端末に酔ってはうまくいかないとかあるのかな)。


あと、取得したファイルパスはURLエンコードされてるのでそのまま使おうとするとハマりました。







今回は以下のことを目的にソースとハマりどころを書いてみました。
・Android端末から外部のIntentを発行してFileエクスプローラのアプリを起動する(Google Driveとか)
・onActivityResultからファイルパスを取得する
・InputStreamを生成する


ハマりどころなどはこんな感じでした。

・Intentでファイルエクスプローラアプリに通知する
・onActivityResultで選択したファイルの通知を受け取る
・Intent#getDataStringでファイルパスは取得できる
・file://は不要っぽいので切り取る
・パスはURLエンコードされているのでデコードする





気がかりな点としては端末依存していないか。
汎用的に使えるような処理になっているのかがちょっと気になりますね。
(例えば端末Aでは・Intent#getDataStringが"file://....."の文字列を返し、端末Bでは"//..."になってるとか)


今どきのAndroidな人はこんなこと考えずとも分かるのかなぁ。
あと外部のアプリケーション頼みなので、ダサいですね。

アプリ内部でエクスプローラー相当の機能を設けたほうがアプリによる差異が出なくて
平和なんだろうな。




2015/03/15 このエントリーをはてなブックマークに追加 はてなブックマーク - 【Kotlin】逆引きKotlinというサイトをはじめました

【Kotlin】逆引きKotlinというサイトをはじめました

カテゴリ: ,









こちらの記事で以前にKotlinには逆引きサイトが無いということに関して
言及しました。そして僕の考えとしては、

・Kotlinを使う参入障壁下げる
・日本語の情報を増やす

という観点から必要性を感じていました。


そして、年末に僕の個人的な今年の抱負として、
「Kotlinの逆引きサイトを立ち上げる」という目標がありました。
で、今月作業を始めまして、なんとかベータ版的な内容量ではありますが形に出来ましたので
ご報告としてエントリを書いてます。


そう、宣伝です(笑)


こちらがそのサイトです。

逆引きKotlin



今のところは以下の様なページが有ります

・Kotlinをインストールする
・KotlinプラグインをIntelliJ IDEAに導入する
・KotlinプラグインをAndroid Studioに入れる
・AndroidでHello World
・KotlinをEclipseで動かす(非推奨)
・変数を宣言する
・型を宣言する
・インスタンスを生成する
・配列を生成する
・関数を宣言する
・条件分岐を行う
・ifを式として扱う
・switchみたいな条件分岐がしたい
・ループ処理を行う







サイトに対しての加筆・修正プルリク新規ページ作成のプルリクなどお待ちしています。
基本的には僕が作っていくつもりですが、公開することでなんらかのフィードバックが得られれば嬉しいなという
狙いがあります(他力本願)。








サイトのソースはGitHubで管理してます。 https://github.com/yyYank/kotlin-rev-solution


mkdocsというpython製の静的サイトジェネレーターを利用してサイトは構築しています。
マークダウン方式で書いてますので、ここらへん
.mdファイルを新規作成するか、既存のものに加筆修正してプルリクしていただければ、こちらで内容を確認の上マージ致します。









今回は簡単ではありますが、サイト開設のアナウンスと、サイト開設の経緯、
また、ソースは公開状態であり、どなたからでもリクエストを受付けているというお話でした。


このサイト開設により、Kotlinを気軽に試せる方が増えてくれればなぁと思っています。


最近の話で言うと、きりみんさんの某記事でKotlinに一気に注目する人が増えたのが
嬉しい誤算でなんだかあっけにとられています笑

2015年のAndroid開発はKotlinで決まりかもしれない - みんからきりまで




冒頭でも述べたように、まだベータ版といったレベルで情報量は少なく、
「逆引きって言う割には逆引出来ないじゃん」みたいな状態ですが、
地道に情報を増やしていき網羅的なものにしていきたいなぁと思っていますので、
温かい目で見ていただければなぁと思っています。。。。








2015/03/01 このエントリーをはてなブックマークに追加 はてなブックマーク - 続・【Selenium WebDriver】wait処理のCustomConditionを作る

続・【Selenium WebDriver】wait処理のCustomConditionを作る

カテゴリ: ,


http://www.softwaretestingclass.com/what-is-selenium-webdriver-selenium-training-series/より引用


前回に書いた記事の waitのCustomConditionなのですが、微妙な気がしたので書き直しました。



2015/02/26 このエントリーをはてなブックマークに追加 はてなブックマーク - 【Selenium WebDriver】wait処理のCustomConditionを作る

【Selenium WebDriver】wait処理のCustomConditionを作る

カテゴリ:


http://www.softwaretestingclass.com/what-is-selenium-webdriver-selenium-training-series/より引用





・selenium-java version 2.44.0






WebDriverWaitは描画処理などの関係でwaitをかけることに特化したクラス。
waitを使うときには以下のように書く。



 
 WebDriverWait wait = new WebDriverWait(driver, 10);
 wait.until(ExpectedConditions.alertIsPresent());
 // 処理
 doSomething();
 ・・・・
 



WebDriverWaitのインスタンスを生成し、untilメソッドで引数で
渡した条件(ExceptedCondtionインスタンス)がtrueになるまで待つ。

(正確に言えば、untilメソッドの引数は
com.google.common.base.Functionインターフェースか
com.google.common.base.Predicateの具象クラスインスタンス。
ExceptedCondtionはFunctionを継承している)



ExpectedConditionsはExpectedConditionインターフェース型の
無名クラスインスタンスを生成するstaticメソッドを持っているのでこのような記述になる。
(ExpectedConditionsクラスとExpectedConditionクラスって紛らわしい)




2015/02/21 このエントリーをはてなブックマークに追加 はてなブックマーク - しょぼちむにデータモデル設計について教えてくださいの会 #syoboben に行ってきました

しょぼちむにデータモデル設計について教えてくださいの会 #syoboben に行ってきました

カテゴリ:









友人のsyobochimが勉強会やるということで、裏方(運営)的なポジションで参加させていただきました。
しょぼちむにデータモデル設計について教えてくださいの会 #syoboben


勉強会の様子はtogetterで雰囲気を感じていただければと思います。
ゆるふわと見せかけてガチ勢が来たしょぼちむ勉強会



会場はドリコムさん。こんなかんじ。エントランスにはベイマックスがいました。





以下、発表を順に振り返ってみます。。。。



GA