PhoneGap(WEBページをアプリにする)やUnity(ゲームエンジン)で多数のアプリを作ってきましたが、実はネイティブアプリを作ったことがないです。
Javaは多少できるのでAndroidStudioでプラグインを作ったことはあります。
XMLによる記述が相容れなくて避けてましたが、できることは多い方がいいのでチャレンジしてみます。
プロジェクトの作成
まずは新規プロジェクトを作成します。
名前とターゲット(保証OSバージョン)を決めます。
ほとんどの端末をカバーできるAPIが選ばれるようですが、未だに16(4.1)という古いバージョンが多くあるみたいですね。
初期アクティビティ(画面)を選びます。
勉強もかねてメニューバーのあるものを選んでみました。
これで起動してみるとこんな感じで動きます。
すでにアプリっぽい!
実装(API取得&表示)
多くの外部APIはJSONで返ってきます。
もともとjavascript用なのでJavaで使うには多少面倒です。
まずはインターネット権限をマニュフェストに追加します。
1 2 3 4 5 6 |
<manifest...> <uses-permission android:name="android.permission.INTERNET" /> <application...> .... </application> </manifest> |
次にAsyncTaskを使ってAPI取得用のクラスを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class GetApi extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... args) { String result = "error"; try { result = myGet(args[0]); } catch (IOException e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { } public String myGet(String urlstr) throws IOException { Log.d("API URL",urlstr); URL url = new URL(urlstr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); int statusCode = conn.getResponseCode(); if(statusCode == HttpURLConnection.HTTP_OK){ StringBuilder result = new StringBuilder(); //responseの読み込み final InputStream in = conn.getInputStream(); final InputStreamReader inReader = new InputStreamReader(in); final BufferedReader bufferedReader = new BufferedReader(inReader); String line = null; while((line = bufferedReader.readLine()) != null) { result.append(line); } bufferedReader.close(); inReader.close(); in.close(); return result.toString(); } return null; } } |
このクラスはAPI URLを渡して返値を文字列として返すだけのクラスです。
実際に使うAPIに合わせて事後処理を変更します。
次のはビットフライヤーのAPIからビットコイン価格と板を取得しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class getBtc extends GetApi{ @Override protected void onPostExecute(String result) { try { JSONObject obj = new JSONObject(result); Double mid = obj.getDouble("mid_price"); JSONArray jabids = obj.getJSONArray("bids"); JSONArray jaasks = obj.getJSONArray("asks"); String strBids = "",strAsks = ""; for(int i=0;i<jabids.length();i++){ String _s = jabids.getJSONObject(i).get("price").toString() + " : " + jabids.getJSONObject(i).get("size").toString() + "\r\n"; strBids += _s; } for(int i=0;i<jaasks.length();i++){ String _s = jaasks.getJSONObject(i).get("price").toString() + " : " + jaasks.getJSONObject(i).get("size").toString() + "\r\n"; strAsks += _s; } mTextMessage = (TextView) findViewById(R.id.message); mTextMessage.setText(mid.toString()+"\r\n"+strBids+strAsks); }catch (JSONException e) { Log.e("API",e.getMessage()); } } } |
あとはアクション時などで次のようにして呼び出します。
1 2 |
getBtc api = new getBtc(); api.execute("https://api.bitflyer.jp/v1/board"); |
これでAPI取得からの表示は完了です。
初期設定のままだと下が隠れたままなのでactivity_main.xmlを変更します。
1 2 3 4 5 6 7 8 9 10 |
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/message" .../> </ScrollView> |
スクロールタグでテキストタグを囲むことで表示オーバーの部分をスクロールできるようになります。
所感
Javaがどうも苦手、XMLはもっと苦手、リファレンスがどうもかみ合わない。
色んなAPIに対応できるように書いたつもりではあるけど、考え方のベースが他言語なので無駄な部分が多くありそう。
Unityで事務系アプリとかを作るのは論外(何個も作った)だけど、PhoneGapで作る方が言語的なノウハウが使いまわしやすくていい気もする。
とはいえ、Androidの標準機能を使う場合だとAndroidStudioを使うのがいいと思うのである程度何でもできるようにしておきたい。けどKotlinはまだ見ないふり。