Android開発との格闘 | イイ感じでお願いします!~ママはパートでプログラマー~

イイ感じでお願いします!~ママはパートでプログラマー~

日常のお話や、お仕事、育児の話、趣味のセルフネイル等々・・・アレコレ好き勝手に書いています☆

九州・熊本の地震、まだまだ余震が続いていますね・・・。

我が家は、夫の母の実家が熊本で、他人ごとでは無いのですが、幸いな事に、義母の実家は人も建物も無事との事。

食器が落ちて割れたとか、その程度で済んだらしいですが、水がダメみたいです。

地盤の緩んだ所への大雨で、まだまだ心配は尽きません。

一日も早く、余震活動が終息し、復旧・復興に向けての活動が始まる事を祈るばかりです。

各企業等のWEBサイトからも募金が出来るサイトが多数立ち上がっていますので、現地に行く事も出来ないし、支援物資もどう送って良いのかわからない・・・でも、何かしたい!という気持ちの有る方は、是非、こういったサイトを利用するなどしてみてください。

アメーバさんでも、募金対象のアイテム販売を、サイト内のゲーム各種で行うようですね。

 

さてさて・・・今日は、先日から取り組んでおりました、勤怠アプリのAndroid版についての、全然面白く無い(笑)話。

 

技術的に手詰まりになってしまったりで、我が社のスーパー何でも出来ちゃう副社長のお力も借り、何とかPlayストアに最新版をアップする事が出来ました。

仕様変更も有ったりしたので・・・途中、本当に泣きそうになりましたけど・・・(;´Д`A ```

 

現役のプログラマーさんが質問サイトや、個人のサイトで技術提供してくださるので、ググっては行き詰まり、またググって・・・と、色々と参考にさせて頂いて、何をしてるのか少し読めるようになった・・・気がします←気がするだけw

 

少し前までは開発環境もeclipse使ってましたが、android開発ツールのサポートが終了という事で・・・AndroidStudioに切り替えました。

で・・・以下、javaのコードが並びます(;´Д`A ```

 

----ここから---------------↓

AndroidManifest.xml

これが入ってなくてver4以前のAndroidでバグった。
 <uses-permission android:name="android.permission.VIBRATE" />


通知後の処理について
 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar"> //←webViewのタイトルバーを無しにして、フル画面表示にする
   
        <!-- push通知タップ時に遷移するActivity -->
        <meta-data android:name="openPushStartActivity" android:value=".MainActivity" />

 

IntentServise.java

 private void sendNotification(String msg) {
        mNotificationManager = (NotificationManager)
                this.getSystemService(Context.NOTIFICATION_SERVICE);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class), 0);

        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
        .setTicker("ステータスバーに表示されるテキスト")
        .setSmallIcon(R.drawable.ic_launcher)  //←アイコン
        .setContentTitle("通知領域を開いた時に表示されるタイトル")
        .setContentText("通知領域を開いた時に表示されるサブタイトル・テキスト文")
        .setAutoCancel(true)            //←通知をタップすると、通知をステータスバーから消す
        .setDefaults(Notification.DEFAULT_SOUND  //通知時の音
                | Notification.DEFAULT_VIBRATE      //通知時のバイブ
                | Notification.DEFAULT_LIGHTS);       //通知時のライト


MainActivity.java
// ウェブビューを作成(実際は、これをメソッド化して使用しました。voidメソッドで引数に、

 WebView開く時に指定するURLにくっ付けるパラメータに使う変数を充てた)
            WebView webView = (WebView)findViewById(R.id.webView1);
            //HTMLのメタタグを反映させる為の記述
            webView.getSettings().setUseWideViewPort(true);
            webView.getSettings().setLoadWithOverviewMode(true);

            // webViewの設定でjavascriptを有効にする
            webView.getSettings().setJavaScriptEnabled(true);

            webView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    return false;
                }
            });

            webView.setWebChromeClient(new WebChromeClient() {
        // javaScriptのアラートを受け取り、androidのToastメッセージで表示する
                @Override
                public boolean onJsAlert(final WebView view, final String url, final String message, JsResult result) {
                    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
                    result.confirm();
                    return true;
                }
        // javaScriptのwindowCloseをwebViewで有効にする
                @Override
                public void onCloseWindow(WebView view) {
                    finish();
                }
            });

        // URLを指定する
        webView.loadUrl("http://・・・・・・・・");


非同期通信のバックグラウンド処理で取得した値を画面制御に渡す(dbへの接続は非同期通信で処理する)
※doInBackgroundの値はonPostExecuteに渡して画面表示する

http://andante.in/i/java/asynctask%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/ 参照

    /**
     * サーバー通信用AsyncTask
     */
    AsyncTask<Void, Void, String[]> mRegisterTask;     //後ろの引数3つについて
                            //  1:doInBackgroundの引数
                            //  2:onProgressUpdateの引数
                            //  3:onPostExecuteの引数(今回は配列でデータを受け取りたいので配列で宣言)

    
    mRegisterTask = new AsyncTask<Void, Void, String[]>() {
          @Override
          protected String[] doInBackground(Void... params) {
             //DBからデータ取得したりする処理

             //今回は配列で戻り値を渡したいので、戻り値String[]のparamsに配列セットした値を返す。
       String[] param = new String[2]; //動的配列であれば、そのように配列作るか、リスト形式で渡すのも有り
                        //今回は、パラメータを2つ渡したかったので、予め配列は2で宣言して
                        //ダイレクトに入れてます。
              param[0]= 取得した値1;
              param[1]= 取得した値2;

              return param;            //returnで引数paramsに配列paramが渡る
          }
    
      @Override
      protected void onProgressUpdate(Integer... values) {}  //これ何だっけ??中身空っぽだし・・・(;´Д`A ```


          @Override
          protected void onPostExecute(String[] result) {    //受け取る側も配列で宣言
              mRegisterTask = null;
        //resultで受け取った配列データを変数にそれぞれ格納し
              String 変数1 = result[0];
              String 変数2 = result[1];
        //画面制御系のメソッドを呼ぶ
              メソッド(変数1,変数2);
          }
        };


//SQLiteDatabaseのメソッドを利用する時の色々
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

MyDBOpenHelper helper = new MyDBOpenHelper(this);
        SQLiteDatabase db = helper.getReadableDatabase();

        // DB読み込み(SQLiteDatabaseクラスのクエリ:引数は”テーブル名”,取得したいカラム(配列で指定),絞り込み条件1,
        絞り込み条件2,group by句,Having句,order by句,limit句。使用しない引数はnullを入れる。
        
        Cursor c = db.query("テーブル名", new String[]{ "カラム1","カラム2" }, null,
                null, null, null, null);
        

        // カーソルを先頭へ持ってくる
        boolean mov = c.moveToFirst();
        
        if (mov) {

            //データがある場合の処理(今回はアップデート)
            ContentValues values = new ContentValues();

            values.put("カラム1", 値1);
                    values.put("カラム2", 値2);
                    db.update("テーブル名", values, null, null); //第三引数はWhere句。第四引数は、第三引数に条件=?
                                   //とした時、?に渡すパラメータをString配列で記述

            c.close();
            db.close();
        }else{
            // データがない場合の処理(今回はインサート)
            ContentValues values = new ContentValues();

            values.put("カラム1", 値1);
                    values.put("カラム2", 値2);
            db.insert("テーブル名", null, values);

            c.close();
            db.close();
        }

  // CREATE TABLEで必要なdbテーブル作成しておく(作ったトコ、コピペ取るの忘れた)

    create table table_name
     (column_name1 column_type, column_name2 column_type, …);
    column_typeについては、型の指定(Stringならtextと指定。)

------ここまで------------------↑

 

プッシュ通知を受け取って、通知をタップして以降の処理で自分が詰まった所をアレコレ抜き出してみました。

プッシュ通知の実装については、Android プッシュ通知 実装 とかでググれば、サンプルコード付きで各クラスの作り方から諸々、丁寧に説明してくださってるサイトさんが沢山有りますので、そこ参考にして下さい(;´Д`A ```

今回の通知実装も、ほぼ、そういうサイトさん利用してます。

 

WebでJavaScriptからPHPでandroidに必要な値を渡して、受け取った値をSqLiteで保存、通知を出し、通知タップしたら、SqLiteに入ったdbの値を取得して、それを元にWebViewを開く・・・というのが一連の大まかな流れです。

一つのURLから、渡すパラメータによって、今度はJavaScriptで遷移先を分岐しています。

同様の動きをiPhoneでも作らなきゃいけないので、WebView内の動きは全てJavaScript側で制御出来るようにしておいた方が便利が良いので・・・。

分岐するパラメータをどうやって乗せて、どう判定しようか・・・と悩みましたが、文字列で丸っと乗せてしまえ!と(笑)

お陰で、SqLiteの使い方も勉強出来たし、悩んだ分だけ自分的には、得た物は大きかったと思います(*´∇`*)