2011年12月26日月曜日

assetsフォルダのデータベースファイル利用

assetsフォルダのデータベース利用2 を新しく書きました。
assetsフォルダにdatabase.dbがある場合

assetsフォルダのデータベースをdatabaseフォルダにコピーして使う
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

public class RopouActivity extends Activity {

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  String DB_PATH = "/data/data/com.yamato.ropou/databases/";
  String DB_NAME = "database.db";

  try {

   InputStream myInput = getResources().getAssets()
     .open("database.db");
//InputStream myInput = this.getResources().openRawResource(R.raw.database);//res/rawフォルダにデータベースがある場合
   String outFileName = DB_PATH + DB_NAME;
   OutputStream myOutput = new FileOutputStream(outFileName);

   byte[] buffer = new byte[2048];
   int length;
   while ((length = myInput.read(buffer)) > 0) {
    myOutput.write(buffer, 0, length);
   }

   // Close the streams
   myOutput.flush();
   myOutput.close();
   myInput.close();

  } catch (IOException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }

        //データベースを開く  
  SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, 0);
         
        Cursor c = db.query("myDatabaseTable", new String[] { "name", "age" },
          null, null, null, null, null);
         
        boolean isEof = c.moveToFirst();
        TextView textView1 = (TextView)findViewById(R.id.textView1);
         
        String text="";
        while (isEof) {
            text += String.format("%s : %d歳\r\n", c.getString(0), c.getInt(1));
            isEof = c.moveToNext();
        }
        textView1.setText(text);
         
        c.close();
        db.close();
    }
}


動かない
package com.android.word.net;

import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class AndroidWordNetActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  AssetManager as = getResources().getAssets();
  
  Log.d("タグ",as.toString() );
  
  //ヘルパークラスのインスタンスを作成します。
        MyDBHelper helper = new MyDBHelper(this,as.toString()+"database.db");
         
        SQLiteDatabase db = helper.getWritableDatabase();
        
        Cursor c = db.query("myDatabaseTable", new String[] { "name", "age" },
          null, null, null, null, null);
         
        boolean isEof = c.moveToFirst();
        TextView textView1 = (TextView)findViewById(R.id.textView1);
         
        String text="";
        while (isEof) {
            text += String.format("%s : %d歳\n", c.getString(0), c.getInt(1));
            isEof = c.moveToNext();
        }
        textView1.setText(text);
         
        c.close();
        db.close();
        
 }
 

 public class MyDBHelper extends SQLiteOpenHelper {
  public MyDBHelper(Context context, String string) {
            super(context, string, null, 1);
        }
  
        @Override
        //ここでデータベース作成(コンストラクタに渡されたDBファイル名が存在しない場合に呼ばれる)
        public void onCreate(SQLiteDatabase db) {
            // テーブルを作成
        }


  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO 自動生成されたメソッド・スタブ
   
  }
 }
}

2011年12月25日日曜日

assetsフォルダのファイル利用

assetsフォルダに入れられるファイルサイズは1MBの制限がある。



package com.android.word.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class AndroidWordNetActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  AssetManager as = getResources().getAssets();

  BufferedReader br = null;
  StringBuilder sb = new StringBuilder();

  try {
   try {
    InputStream is = as.open("asset_file.txt");
    br = new BufferedReader(new InputStreamReader(is));

    String str;
    while ((str = br.readLine()) != null) {
     sb.append(str + "\n");
    }
   } finally {
    if (br != null)
     br.close();
   }
  } catch (IOException e) {
   Toast.makeText(this, "読み込み失敗", Toast.LENGTH_SHORT).show();
  }
  TextView label = (TextView) this.findViewById(R.id.textView1);
  label.setText(sb.toString());
 }
}

GETでホームページ取得:Android Http インターネット


package com.android.test;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;

public class AndroidTestHttpActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
  
  HttpURLConnection http = null;
  InputStream in = null;
  TextView web = (TextView) findViewById(R.id.textView1);
  try {
   // URLにHTTP接続
   URL url = new URL("http://www.google.co.jp");
   http = (HttpURLConnection) url.openConnection();
   http.setRequestMethod("GET");
   http.connect();
   // データを取得
   in = http.getInputStream();

   // HTMLソースを読み出す
   String src = new String();
   byte[] line = new byte[1024];
   int size;
   while (true) {
    size = in.read(line);
    if (size <= 0)
     break;
    src += new String(line);
   }
   // HTMLソースを表示
   web.setText(src);
  } catch (Exception e) {
   web.setText(e.toString());
  } finally {
   try {
    if (http != null)
     http.disconnect();
    if (in != null)
     in.close();
   } catch (Exception e) {
   }
  }

 }
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AndroidTestHttpActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2011年12月24日土曜日

端末起動時にサービスを実行:タイマーで指定時間から繰り返し

端末起動時にサービスを実行:タイマーで繰り返し の記事の一部を修正

package com.my.android.test;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MainService extends Service {
 private Timer timer;
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 @Override
   public void onCreate() {
     super.onCreate();
     Log.d("TAG", "onCreate");
   }
 @Override
 //onStartは2.0以降は非推奨でonStartCommandを使うことが推奨されている
 //public void onStart(Intent intent, int startId) {
 public int onStartCommand(Intent intent, int flags, int startId) {
  //現在時刻の取得
  long currentTimeMillis = System.currentTimeMillis();
  Date date = new Date(currentTimeMillis + 10000);//現在時刻+10秒

  // タイマの設定
  timer = new Timer(true);
  final Handler handler = new Handler();
  //service = Executors.newSingleThreadScheduledExecutor();
  timer.scheduleAtFixedRate( new TimerTask() {
   @Override
   public void run() {
    handler.post(new Runnable() {
     public void run() {
       Log.d("TAG", "onStartCommand");
     }
    });
   }
  }, date, 3000);//スタート時間、3秒間隔
  //super.onStart(intent, startId);
  return START_STICKY;
 }
 @Override
   public void onDestroy() {
     super.onDestroy();
     if(timer != null){
       timer.cancel();
     }
     Log.d("TAG", "onDestroy");
   }

}

Executorsクラスで繰り返し

端末起動時にサービスを実行:タイマーで繰り返しの記事の一部を修正


package com.my.android.test;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MainService extends Service {
 private Timer timer;
 private ScheduledExecutorService service;
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 @Override
   public void onCreate() {
     super.onCreate();
     Log.d("TAG", "onCreate");
   }
 @Override
 //onStartは2.0以降は非推奨でonStartCommandを使うことが推奨されている
 //public void onStart(Intent intent, int startId) {
 public int onStartCommand(Intent intent, int flags, int startId) {
  
  final Handler handler = new Handler();
  service = Executors.newSingleThreadScheduledExecutor();
  service.scheduleAtFixedRate( new TimerTask() {
   @Override
   public void run() {
    handler.post(new Runnable() {
     public void run() {
       Log.d("TAG", "onStartCommand");
     }
    });
   }
  }, 1000, 3000, TimeUnit.MILLISECONDS);//遅延、3秒間隔、単位時間
  //super.onStart(intent, startId);
  return START_STICKY;
 }
 @Override
   public void onDestroy() {
     super.onDestroy();
     if(timer != null){
       timer.cancel();
     }
     Log.d("TAG", "onDestroy");
   }

}

2011年12月22日木曜日

端末起動時にサービスを実行:タイマーで繰り返し


package com.my.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MainReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  Log.v("タグ", "onReceive");
  // サービスを起動する(BOOT_COMPLETED時)
  context.startService(new Intent(context, MainService.class));
 }
}


package com.my.android.test;

import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MainService extends Service {
 private Timer timer;
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 @Override
   public void onCreate() {
     super.onCreate();
     Log.d("TAG", "onCreate");
   }
 @Override
 //onStartは2.0以降は非推奨でonStartCommandを使うことが推奨されている
 //public void onStart(Intent intent, int startId) {
 public int onStartCommand(Intent intent, int flags, int startId) {
  // タイマの設定
  timer = new Timer(true);
  final Handler handler = new Handler();
  timer.schedule(new TimerTask() {
   @Override
   public void run() {
    handler.post(new Runnable() {
     public void run() {
       Log.d("TAG", "onStartCommand");
     }
    });
   }
  }, 1000, 3000);//3秒間隔
  //super.onStart(intent, startId);
  return START_STICKY;
 }
 @Override
   public void onDestroy() {
     super.onDestroy();
     if(timer != null){
       timer.cancel();
     }
     Log.d("TAG", "onDestroy");
   }

}


package com.my.android.test;

import android.app.Activity;
import android.os.Bundle;

public class MyAndroidTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.android.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".MyAndroidTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="MainReceiver" >
            <intent-filter >

                <!-- デバイスブート時のインテントを受け取るレシーバ -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <service android:name="MainService" >
        </service>
    </application>

</manifest>

Serviceのライフサイクル


サービスの開始

onCreate:サービスが作成された際に呼び出し

onStart:サービスが開始されたタイミングで呼び出される

サービスの実行

onDestroy:サービスが破棄された際に呼び出し

サービスの終了

2011年12月21日水曜日

AVDに端末起動のシグナルを送る

コマンドプロンプトを起動させる。

E:\soft\android-sdk-windows\platform-tools>adb shell
# am broadcast -a android.intent.action.BOOT_COMPLETED

指定時間に実行


package com.android.test;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class AndroidTestActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);
 }

 public void onClickStart(View view) {
  Log.d("タグ", "スタート");
  Intent intent = new Intent(this, MyReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

  // アラームマネージャの用意(初回は5秒後,そのあとは3秒毎に実行
    //AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    // 実行間隔設定
    long interval = 3 * 1000;

    // 初回開始時間
    Calendar calendar = Calendar.getInstance(); // Calendar取得
    calendar.setTimeInMillis(System.currentTimeMillis()); // 現在時刻を取得
    calendar.add(Calendar.SECOND, 10); // 現時刻より10秒後を設定

    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), interval, sender);

 }
 public void onClickStop(View view) {
  Log.d("タグ", "ストップ");
  Intent intent = new Intent(this, MyReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.cancel(sender);
 }
}


package com.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context arg0, Intent arg1) {
  // TODO 自動生成されたメソッド・スタブ
  Log.d("タグ", "MyReceiver:onReceive");
 }

}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start" android:onClick="onClickStart"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop" android:onClick="onClickStop"/>

</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AndroidTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="MyReceiver"></receiver>
    </application>

</manifest>

AlarmManagerを使って定期処理2


package com.android.test;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;

public class AndroidTestActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }

 public void onClickStart(View view) {
  Log.d("タグ", "スタート");
  Intent intent = new Intent(this, MyReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

  // アラームマネージャの用意(初回は5秒後,そのあとは3秒毎に実行
    //AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    // 初回開始時間
    long firstTime = SystemClock.elapsedRealtime();
    firstTime += 5 * 1000;

    // 実行間隔設定
    long interval = 3 * 1000;

    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, interval, sender);
 }
 public void onClickStop(View view) {
  Log.d("タグ", "ストップ");
  Intent intent = new Intent(this, MyReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.cancel(sender);
 }
}


package com.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context arg0, Intent arg1) {
  // TODO 自動生成されたメソッド・スタブ
  Log.d("タグ", "MyReceiver:onReceive");
 }

}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start" android:onClick="onClickStart"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop" android:onClick="onClickStop"/>

</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AndroidTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="MyReceiver"></receiver>
    </application>

</manifest>

AlarmManagerを使って定期処理

このプログラムは動かない。
アンドロイドプロジェクトを作成して、
修正を加えないでインストールした後、
修正を加えてインストールしないと動かない。

package com.android.test;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;

public class AndroidReceiverTestActivity extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO 自動生成されたメソッド・スタブ
  Log.d("タグ", "onReceive");

  //レシーバーセット
  Intent my_intent = new Intent(context, MyReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(context, 0,my_intent, 0);

  // アラームマネージャの用意(初回は5秒後,そのあとは3秒毎に実行
  AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

  // 初回開始時間
  long firstTime = SystemClock.elapsedRealtime();
  firstTime += 5 * 1000;

  // 実行間隔設定
  long interval = 3 * 1000;

  alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, interval, sender);
 }

}


package com.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO 自動生成されたメソッド・スタブ
  Log.d("タグ", "MyReceiver:onReceive");
 }

}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">

  <receiver android:name="AndroidReceiverTestActivity">
   <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <action android:name="com.android.vending.INSTALL_REFERRER" />
   </intent-filter>
  </receiver>
  
  <receiver android:name="MyReceiver"></receiver>

 </application>

</manifest>

2011年12月19日月曜日

端末起動時にサービスを起動させる

レシーバーで端末が起動したのを受け取って、
サービスを起動させる。

package com.android.my.test;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

 @Override
 public IBinder onBind(Intent intent) {
  // TODO 自動生成されたメソッド・スタブ
  return null;
 }

 public void onCreate() {
  Log.d("タグ", "onCreate");
 }

 public void onStart(Intent intent, int StartId) {
  super.onStart(intent, StartId);
  // stopSelf();
  Log.d("タグ", "onStart");
 }

 public void onDestroy() {
  Log.d("タグ", "onDestroy");
 }

}


package com.android.my.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BootReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
         Log.d("タグ", "onReceive");
            context.startService(new Intent(context, MyService.class));
        }
    }
}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.my.test"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="14" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <service android:name="MyService" >
        </service>

        <receiver
            android:name="BootReciever"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <activity
            android:label="@string/app_name"
            android:name=".AdnroidServiceTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

BOOT_COMPLETEDをReceiveするアプリの場合、
実際にBOOT_COMPLETEDがBroadcastされるのはシステム起動時だけなので、
動作確認はAVDにコマンドプロンプトからamコマンドからインテントを投げて確認する。
E:\soft\android-sdk-windows\platform-tools>adb shell
# am broadcast -a android.intent.action.BOOT_COMPLETED 

アクティビティーはプロジェクト作成時に自動的に作成されたのを残しています。
必要ないのでマニフェストのアクティビティー関連の設定を削除して、
アプリの上書きをした場合は動きますが、
アプリを削除して、再インストールした場合は動きません。

Serviceを使ってみる


実行結果
12-19 06:51:44.123: D/タグ(5143): onCreate
12-19 06:51:44.123: D/タグ(5143): onStart
12-19 06:51:44.292: D/タグ(5143): onDestroy


package com.android.my.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class AdnroidServiceTestActivity extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // setContentView(R.layout.main);//アックティビティーに追加
  Intent intent = new Intent(this, MyService.class);
  startService(intent);
 }

}


package com.android.my.test;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

 @Override
 public IBinder onBind(Intent intent) {
  // TODO 自動生成されたメソッド・スタブ
  return null;
 }

 public void onCreate() {
  Log.d("タグ", "onCreate");
 }

 public void onStart(Intent intent, int StartId) {
  Log.d("タグ", "onStart");
  stopSelf();
 }

 public void onDestroy() {
  Log.d("タグ", "onDestroy");
 }

}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.my.test"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="14" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AdnroidServiceTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="MyService" >
        </service>
    </application>
</manifest>

2011年12月18日日曜日

カメラで撮影した画像をメールで送る

JavaMailを利用してgoogleのGmailにメールを送る場合


package com.android;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.StrictMode;

public class AndroidTestActivity extends Activity {
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Camera camera = Camera.open(0);//カメラを開く
        camera.takePicture(null, null, mPictureListener);
        
  setContentView(R.layout.main);
    }

 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // メールで画像を送る
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
         
         final String mUser = "kameji2000@gmail.com";
         final String mPassword = "xxxx";

         Properties props = new Properties();

         props.put("mail.smtp.host", "smtp.gmail.com");// SMTPサーバ名
         props.put("mail.smtp.port", "587"); // SMTPサーバポート
         props.put("mail.smtp.auth", "true");// smtp auth
         props.put("mail.smtp.starttls.enable", "true");// STTLS

         Session sess = Session.getInstance(props);

         MimeMessage mimeMsg = new MimeMessage(sess);
         
         try {

             mimeMsg.setFrom(new InternetAddress(mUser));//Fromアドレス
             mimeMsg.setRecipient(Message.RecipientType.TO, new InternetAddress(mUser));//送信先アドレス
             mimeMsg.setContent("body", "text/plain; utf-8");
       mimeMsg.setHeader("Content-Transfer-Encoding", "7bit");
       mimeMsg.setSubject("テスト送信");//件名
       //mimeMsg.setText("アンドロイドからの送信", "utf-8");//本文
       
       MimeBodyPart textPart = new MimeBodyPart();
       textPart.setText("アンドロイドからの送信", "utf-8");//本文
       
        //4, 画像ファイルを添付&設定  
             MimeBodyPart image = new MimeBodyPart();
             DataSource ds = new ByteArrayDataSource(data, "application/x-any");
             image.setDataHandler(new DataHandler(ds));
             image.setFileName("camera.jpg");
             
             MimeMultipart body = new MimeMultipart();
             body.addBodyPart(textPart);                
             body.addBodyPart(image);
             
             mimeMsg.setContent(body); 
       
       Transport transport = sess.getTransport("smtp");
       transport.connect(mUser, mPassword);
       transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());// メール送信
       transport.close();

         } catch (Exception e) {
             e.printStackTrace();
         }

  }
 };

}

JavaMailで送信:Android インターネット

JavaMail の準備

JavaMailのダウンロード
http://code.google.com/p/javamail-android/

mail.jar
additionnal.jar
activation.jar

Javaのビルドパスに設定する。

エラー
android.os.NetworkOnMainThreadException

上記のエラーが出た場合の対策
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

メールアドレスとパスワードはそれぞれ設定して下さい。

package com.android;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import android.app.Activity;
import android.os.Bundle;
//import android.os.StrictMode;

public class AndroidTestActivity extends Activity {
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

        final String mUser = "kameji2000@gmail.com";
        final String mPassword = "xxxx";

        Properties props = new Properties();

        props.put("mail.smtp.host", "smtp.gmail.com");// SMTPサーバ名
        props.put("mail.smtp.port", "587"); // SMTPサーバポート
        props.put("mail.smtp.auth", "true");// smtp auth
        props.put("mail.smtp.starttls.enable", "true");// STTLS

        Session sess = Session.getInstance(props);

        MimeMessage mimeMsg = new MimeMessage(sess);


        try {
           /*
            final MimeMessage mimeMsg = new MimeMessage(Session.getDefaultInstance(props, new Authenticator() {
                @Override
                // 認証データ。アカウント名とパスワードを指定して下さい。
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(mUser, mPassword);
                }
            }));
 */

      mimeMsg.setFrom(new InternetAddress(mUser));//Fromアドレス
      mimeMsg.setRecipient(Message.RecipientType.TO, new InternetAddress(mUser));//送信先アドレス
      mimeMsg.setContent("body", "text/plain; utf-8");
      mimeMsg.setHeader("Content-Transfer-Encoding", "7bit");
      mimeMsg.setSubject("テスト送信");//件名
      mimeMsg.setText("アンドロイドからの送信", "utf-8");//本文

      Transport transport = sess.getTransport("smtp");
      transport.connect(mUser, mPassword);
      transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());// メール送信
      transport.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

  setContentView(R.layout.main);
    }

}


マニフェストの設定
<uses-permission android:name="android.permission.INTERNET" />

エラー対策
java.lang.NoClassDefFoundError: javax.mail.Session
のエラーがでた、外部jarファイルの場所が悪いみたい、
プロジェクトに libs フォルダを作って、そこに jar ファイルを入れて、そこからビルドパスに追加する。

2011年12月17日土曜日

サーフェイスビューにカメラの映像をプレビュー:Android Camera



USBカメラを繋げて表示しているので、カメラを回転させたり、
カメラサイズを取得して、サーフェイスに設定したりしています。


package com.android_test;

import java.io.FileOutputStream;
import java.util.List;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

public class AndroidTestActivity extends Activity {
 private String filePath;
 private Camera camera;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  SurfaceView mySurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
  SurfaceHolder holder = mySurfaceView.getHolder();
  holder.addCallback(mSurfaceListener);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  // カメラの総数
  int numberOfCameras = Camera.getNumberOfCameras();
  Log.d("個数", String.valueOf(numberOfCameras));

  // 保存フォルダの取得
  filePath = Environment.getExternalStorageDirectory().getPath();// /mnt/sdcard
  Log.d("SDカードのパス", filePath);
 }

 private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback() {
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera = Camera.open(0);
   try {
    camera.setPreviewDisplay(holder);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera.release();
   camera = null;
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   Log.d("サーフェイスサイズ", "w=" + String.valueOf(width) + "h=" + height);// 480x661

   camera.setDisplayOrientation(90);// カメラを回転
   Camera.Parameters parameters = camera.getParameters();
   List<Camera.Size> size = parameters.getSupportedPreviewSizes();

   Log.d("カメラのサイズ", "w=" + String.valueOf(size.get(0).width) + "h="
     + String.valueOf(size.get(0).height));// 480x640
   parameters.setPreviewSize(size.get(0).width, size.get(0).height);
   camera.setParameters(parameters);
   camera.startPreview();
  }
 };

 // ボタンが押された時の処理
 public void SetButtonOnClick(View v) {
  // camera = Camera.open(1);//カメラを開く
  // カメラ画像を取得
  camera.takePicture(null, null, mPictureListener);
 }

 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // SDカードにJPEGデータを保存する
   if (data != null) {
    FileOutputStream myFOS = null;
    try {
     myFOS = new FileOutputStream(filePath
       + "/DCIM/Camera/camera_test.jpg");
     myFOS.write(data);
     myFOS.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
    camera.release();
   }
  }
 };
}


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" android:layout_weight="1"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" android:onClick="SetButtonOnClick"/>

</LinearLayout>


カメラサイズを取得して同じ値を設定している部分は、
意味のない処理をしているかもしれません。

Android:カメラで撮影:hardware.Camera

画面にカメラの映像は映さないで、
ボタンを押して撮影してSDカードに保存するだけのソース。


package com.android_test;

import java.io.FileOutputStream;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;

public class AndroidTestActivity extends Activity {
 private String filePath;

 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // カメラの総数
  int numberOfCameras = Camera.getNumberOfCameras();
  Log.d("個数", String.valueOf(numberOfCameras));

  //保存フォルダの取得
  filePath = Environment.getExternalStorageDirectory().getPath();// /mnt/sdcard
  Log.d("SDカードのパス", filePath );
    }
    //ボタンが押された時の処理
    public void SetButtonOnClick(View v) {
     Camera camera = Camera.open(1);//カメラを開く
     //カメラ画像を取得
     camera.takePicture(null, null, mPictureListener);
 }

 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // SDカードにJPEGデータを保存する
   if (data != null) {
    FileOutputStream myFOS = null;
    try {
     myFOS = new FileOutputStream( filePath + "/DCIM/Camera/camera_test.jpg");
     myFOS.write(data);
     myFOS.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
    camera.release();
   }
  }
 };
}

マニフェストファイルに追加
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />

撮影した画像 640x480


USBカメラを接続して撮影した画像
Camera.open(0);

2011年12月13日火曜日

EditTextの入力を無効にする

//EditText を取得
EditText editText = (EditText) findViewById(R.id.editText1);
editText.setInputType(0);

2011年12月10日土曜日

ViewFlipperにアニメーション設定



package com.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;

public class AndroidTestActivity extends Activity {

 private ViewFlipper viewFlipper;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper1);
 }

 public void MyOnClickButtonNext(View v) {
  viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_left));
        viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_right));
        viewFlipper.showNext();
 }

 public void MyOnClickButtonPrevious(View v) {
  viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_right));
        viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_left));
        viewFlipper.showPrevious();
 }
}

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="メイン画面" />

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="MyOnClickButtonPrevious"
            android:text="戻る" />

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="MyOnClickButtonNext"
            android:text="次へ" />
    </LinearLayout>

    <ViewFlipper
        android:id="@+id/viewFlipper1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <include
            android:id="@+id/firstlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            layout="@layout/first" />

        <include
            android:id="@+id/secondlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            layout="@layout/second" />

        <include
            android:id="@+id/thirdlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            layout="@layout/third" />
    </ViewFlipper>

</LinearLayout>

res/layout/first.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一画面" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/vermeer02" android:layout_gravity="center_horizontal"/>

</LinearLayout>

res/anim/in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set
  xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="-100%p"
    android:toXDelta="0"
    android:duration="500"/>
</set>

res/anim/in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set 
  xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="100%p"
    android:toXDelta="0"
    android:duration="500"/>
</set>

res/anim/out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set
  xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="0"
    android:toXDelta="-100%p"
    android:duration="500"/>
</set>

res/anim/out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set
  xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="0"
    android:toXDelta="100%p"
    android:duration="500"/>
</set>

github で見る

https://github.com/OESF/OHA-Android-4.0.1_r1.0

msysgitでソースコードのダウンロード

msysgit をインストールして起動させる。

デスクトップに出来たGit Bash をダブルクリックする。
起動したら下記のコードを打ち込んでダウンロード開始

2011年12月9日金曜日

ViewFlipper



package com.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ViewFlipper;

public class AndroidTestActivity extends Activity {
    
 private ViewFlipper viewFlipper;
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper1);

    }
 public void MyOnClickButtonNext(View v) {
  viewFlipper.showNext();
    }
 public void MyOnClickButtonPrevious(View v) {
  viewFlipper.showPrevious();
 }
 public void MyOnClickButtonTherd(View v) {
  viewFlipper.setDisplayedChild(2);
  
 }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="メイン画面" />

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="MyOnClickButtonPrevious"
            android:text="戻る" />

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="MyOnClickButtonNext"
            android:text="次へ" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="MyOnClickButtonTherd"
            android:text="第三画面" />
    </LinearLayout>

    <ViewFlipper
        android:id="@+id/viewFlipper1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <include
            android:id="@+id/firstlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            layout="@layout/first" />

        <include
            android:id="@+id/secondlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            layout="@layout/second" />

        <include
            android:id="@+id/thirdlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            layout="@layout/third" />
    </ViewFlipper>

</LinearLayout>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一画面" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/vermeer02" 
        android:layout_gravity="center_horizontal"/>

</LinearLayout>


参考:
You must specifiy a valid layout reference. The layout ID @layout/xxx と表示された場合、
Eclipseを再起動させる。

2011年12月8日木曜日

ViewSwicherにアニメーション設定



ViewSwicherで画面切り替えの記事
に画面が切り替わる時のアニメーションを設定する。

/res/anim フォルダにアニメーションファイルを二つ作成する

main.xmlファイルにアニメーションを設定する。



<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ViewSwitcher
        android:id="@+id/viewSwitcher1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inAnimation="@anim/in_animation"
        android:outAnimation="@anim/out_animation" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:src="@drawable/monalisa" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:src="@drawable/botticelli1" />

    </ViewSwitcher>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="MyOnClickButton"
        android:text="Button" />

</LinearLayout>

ViewSwicherで画面切り替え



ViewSwicher では二つのViewを切替える事が出来るようです。

パレットからViewSwicherをLinearLayoutの中に追加して、
ViewSwicherの中にImageViewを二つ追加しました。
ボタンをクリックしたら、ImageViewが切り替わります。

package com.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ViewSwitcher;

public class AndroidTestActivity extends Activity {
    private ViewSwitcher viewSwitcher;
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher1);
    }
 public void MyOnClickButton(View v) {
  viewSwitcher.showNext();
    }
}



<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ViewSwitcher
        android:id="@+id/viewSwitcher1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:src="@drawable/monalisa" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:src="@drawable/botticelli1" />

    </ViewSwitcher>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="MyOnClickButton"
        android:text="Button" />

</LinearLayout>

2011年11月28日月曜日

アクティビティのライフサイクル

  • void onCreate(Bundle savedInstanceState)
    Activiy が始めて作成されるときに呼び出される
  • void onStart()
    Activity がユーザーから見えるようになる直前に呼び出される
  •  void onRestart()
     Activity 停止後、再会するときに呼び出される
  •  void onResume()
    Activity がユーザーとの対話を開始する直前に呼び出される
  •  void onPause()
    システムが別の Activity を開始しようとしているときに呼び出される
  •  void onStop()
     Activity がユーザーから見えなくなったときに呼び出される
  •  void onDestroy()
    Activity が破棄される前に呼び出される


参考:開発の基礎

2011年11月27日日曜日

日付(数字)でテーブル名を作成



String deteTime = "201108151235";
String tableName = "\"" + deteTime + "\"";

 public void onCreate(SQLiteDatabase db) {
  // TODO 自動生成されたメソッド・スタブ
  //Log.d("テーブルネーム", tableName );
            // テームルを作成
  db.execSQL(
    "CREATE TABLE " + tableName + " (" +
                "id INTEGER PRIMARY KEY ,"+
                "kaitou text ,"+
                "age text"+
                ");"
            );
 }

2011年11月26日土曜日

Unfortunately, camera has stopped対策



日本語でのメッセージは、
申し訳ありませんが、カメラは停止しました。

このメッセージが出たら、カメラを起動させても、おなじメッセージが出るので、
カメラのデータをクリアにします。
MENU->アプリの管理->カメラ->データを消去

MENU ->Manage apps -> Camera -> Clear data

カメラのサイズと表示するサーフェイスの大きさの違いで出るみたいなので、
カメラサイズを取得してサーフェイスに設定するとかすればいいみたい。
下の記事にカメラサイズの取得方法とか書いてみた、
サーフェイスビューにカメラの映像をプレビュー

2011年11月25日金曜日

AVDとUSBカメラを繋げて撮影


AVDの設定

撮影した画像はSDカードに保存されるので、 SDカードの設定もしておきます。
追記:
ターゲットに注意してください。
Camera support の設定は無くても大丈夫なようでした。

カメラで撮影した画像の保存場所
右上のフロッピーのアイコンをクリックすればローカルフォルダに保存して、
確認する事が出来る。

AVDのカメラのアイコンから起動するか、
AVDのApps の中のAPI Demos のGraphicsの中のCameraPreviewを
起動させると、最初はUSBカメラでは無い画面が立ち上がって、
MENU ボタンを押してSwitch Cameraを押すとUSBカメラの画面に切り替わる


2011年11月24日木曜日

顔認識テスト


package com.test;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class Test01Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        setContentView(new myView(this));
    }

    private class myView extends View{

     private int imageWidth, imageHeight;
     private int numberOfFace = 5;
     private FaceDetector myFaceDetect;
     private FaceDetector.Face[] myFace;
     float myEyesDistance;
     int numberOfFaceDetected;

     Bitmap myBitmap;

  public myView(Context context) {
   super(context);
   // TODO Auto-generated constructor stub

   BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
   BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
   //myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a0002_006064, BitmapFactoryOptionsbfo);
   
   myBitmap = BitmapFactory.decodeFile("/mnt/sdcard/Pictures/09kaiga-bu.jpg/" , BitmapFactoryOptionsbfo);
   //myBitmap     = myBitmap.copy(Bitmap.Config.RGB_565, true);
   
   
   imageWidth = myBitmap.getWidth();
   imageHeight = myBitmap.getHeight();
   myFace = new FaceDetector.Face[numberOfFace];
   myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);
   numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace);
   
   Log.d("顔の個数", String.valueOf( numberOfFaceDetected ) );
   
   Face face = myFace[0]; 
   PointF point = new PointF();
   face.getMidPoint(point);//両目の中心座標
   myEyesDistance = face.eyesDistance();//両目間の距離
    
   Log.d("信頼度", String.valueOf( myFace[0].confidence() ) );
   Log.d("両目の距離", String.valueOf( myEyesDistance) );//49.265625
   
   Log.d("x", String.valueOf( point.x) );//211.83594
   Log.d("y", String.valueOf( point.y) );//108.375

  }

  @Override
  protected void onDraw(Canvas canvas) {
   // TODO Auto-generated method stub

            canvas.drawBitmap(myBitmap, 0, 0, null);

            Paint myPaint = new Paint();
            myPaint.setColor(Color.GREEN);
            myPaint.setStyle(Paint.Style.STROKE);
            myPaint.setStrokeWidth(3);

            for(int i=0; i < numberOfFaceDetected; i++)
            {
             Face face = myFace[i];
             PointF myMidPoint = new PointF();
             face.getMidPoint(myMidPoint);
    myEyesDistance = face.eyesDistance();
             canvas.drawRect(
               (int)(myMidPoint.x - myEyesDistance),//162.570315
               (int)(myMidPoint.y - myEyesDistance),//59.109375
               (int)(myMidPoint.x + myEyesDistance),//261.101565
               (int)(myMidPoint.y + myEyesDistance),//157.640625
               myPaint);
            }
  }
    }
}

2011年11月23日水曜日

独自のView でCanvas に座標を指定して表示


package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class Test01Activity extends Activity {
 public class CustomView extends View {
  private Bitmap image;

  public CustomView(Context context) {
   super(context);
   // TODO 自動生成されたコンストラクター・スタブ
   setFocusable(true);
  }

  protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   File srcFile = new File("/mnt/sdcard/Pictures/a0002_006064.jpg");
   try {
    InputStream is = new FileInputStream(srcFile);
    image = BitmapFactory.decodeStream(is);
   } catch (FileNotFoundException e) {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
   }
   canvas.drawBitmap(image, 0, 0, null);
  }
 }

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // タイトルの非表示
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  // タスクバーの非表示
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

  // Activityに直接を追加する
  setContentView(new CustomView(this));

 }
}

Pictures フォルダの画像をImageView に表示


package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;

public class Test01Activity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // タイトルの非表示  
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        //タスクバーの非表示  
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  setContentView(R.layout.main);

  ImageView v = (ImageView) findViewById(R.id.imageView1);
  
  File srcFile = new File("/mnt/sdcard/Pictures/a0002_006064.jpg");

  try {
   InputStream is = new FileInputStream(srcFile);
   Bitmap bm = BitmapFactory.decodeStream(is);
   v.setImageBitmap(bm);

  } catch (FileNotFoundException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }

 }
}

画面のタスクバーとタイトルバーの非表示



// タイトルの非表示  
requestWindowFeature(Window.FEATURE_NO_TITLE); 
//タスクバーの非表示  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
        
setContentView(R.layout.main);

Pictures フォルダの取得

sdcard/Pictures フォルダの取得

package com.test;

import java.io.File;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;

public class Test01Activity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  Log.d("パス", path.toString());

 }
}



Pictures フォルダ内のファイルの個数
Log.d("パス", String.valueOf(path.list(null).length));

Pictures フォルダ内の最初のファイル名
Log.d("パス", path.list(null)[0]);

データベース一覧取得・表示


/data/data/アプリケーション名/databases フォルダ内のファイル名の一覧取得・表示

package com.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Test01Activity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  //Context con = this;
  String[] str = this.databaseList();
  Log.d("個数", String.valueOf(str.length));

  TextView textView1 = (TextView) findViewById(R.id.textView1);

  String text = "";

  for (int i = 0; i < str.length; i++) {
   text += str[i] + "\n";
  }
  textView1.setText(text);
 }
}

テーブル一覧取得・表示


コマンドラインからは .tables で表示される。データベースのテーブル一覧を取得する方法。

Cursor c = db.rawQuery("SELECT * FROM sqlite_master WHERE type='table' ", null);

Log.d("個数", String.valueOf(c.getCount()));


ソースコード全体

package com.test;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Test01Activity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  // ヘルパークラスのインスタンスを作成します。
        MyDBHelper helper = new MyDBHelper(this);
        
        //書き込み可能でデータベースを開く 
        //(ここでDBファイルがなかったら作成する(onCreate)
        SQLiteDatabase db = helper.getWritableDatabase();
         
        Cursor c = db.rawQuery("SELECT * FROM sqlite_master WHERE type='table' ", null);

        Log.d("個数", String.valueOf(c.getCount()));
        
        boolean isEof = c.moveToFirst();
        TextView textView1 = (TextView)findViewById(R.id.textView1);
         
        String text="";
        while (isEof) {
            text += c.getString(1) + "\n";
            isEof = c.moveToNext();
        }
        textView1.setText(text);
         
        c.close();
        db.close();
    }
 
    public class MyDBHelper extends SQLiteOpenHelper {
         public MyDBHelper(Context context) {
             super(context, "database.db", null, 2);
         }
  
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          //データベースのバージョンが変わる場合に呼び出される。
             db.execSQL(
                  "create table myDatabaseTable2("+
                  "name text not null,"+
                  "age text"+
                  ");"
              );
   
              // Insert文のSQLを実行してレコードを挿入
              db.execSQL("insert into myDatabaseTable2(name,age) values ('聖徳太子2', 10);");
              db.execSQL("insert into myDatabaseTable2(name,age) values ('夏目漱石2', 20);");
         }
  
         @Override
         //ここでデータベース作成(コンストラクタに渡されたDBファイル名が存在しない場合に呼ばれる)
         public void onCreate(SQLiteDatabase db) {
             // テームルを作成
             db.execSQL(
                 "create table myDatabaseTable("+
                 "name text not null,"+
                 "age text"+
                 ");"
             );
  
             // Insert文のSQLを実行してレコードを挿入
             db.execSQL("insert into myDatabaseTable(name,age) values ('聖徳太子', 10);");
             db.execSQL("insert into myDatabaseTable(name,age) values ('夏目漱石', 20);");
         }
     }
 }

その他の確認方法

2011年11月22日火曜日

sql文で検索-特定の行だけ検索

Cursor c = db.rawQuery("Select * From myDatabaseTable WHERE age=10",
                null);

Log.d("個数", String.valueOf(c.getCount()));

2011年11月20日日曜日

画面遷移-アニメーション



アニメーションファイルを4つ作成して画面遷移の際に指定するだけ
startActivityForResult・・・の下に
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
の一文を加える

メイン画面のActivityファイル
package com.slide;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class SlideTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
 public void ButtonOnClick(View v){
      Intent subactivity = new Intent(this,com.slide.SubActivity.class);
      startActivityForResult(subactivity, R.id.button1);
      overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
     }
}

サブ画面のActivityファイル
package com.slide;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class SubActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);
    }
 public void ButtonOnClick(View v){
      Intent subactivity = new Intent(this,com.slide.SlideTestActivity.class);
      startActivityForResult(subactivity, R.id.button1);
      overridePendingTransition(R.anim.slide_in_left,R.anim.slide_out_right);
     }
}


メイン画面のレイアウトファイル
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="メイン画面" />
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="次へ" android:onClick="ButtonOnClick"/>

</LinearLayout> 


サブ画面のレイアウトファイル
sub.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="サブ画面" />
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="戻る" android:onClick="ButtonOnClick"/>

</LinearLayout>

アニメーションファイルを用意する
resフォルダの中にanimフォルダを作成して、そこにxmlファイルを作成する。

次のアクティビティが右から登場
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="300"
        android:fromXDelta="100%p"
        android:toXDelta="0" />

    <alpha
        android:duration="300"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

</set>

現在のアクティビティが左に消える
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />

    <alpha
        android:duration="300"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

</set>

元のアクティビティが左から登場
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="300"
        android:fromXDelta="-100%p"
        android:toXDelta="0" />

    <alpha
        android:duration="300"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

</set>

二つ目のアクティビティが右に退場
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="100%p" />

    <alpha
        android:duration="300"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

</set>

サブ画面をマニフェストファイルに追加するのを忘れないようにする。
ダウンロード

テキストビューにボタンのスタイルを設定

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/Button"/>


    <style name="Button" parent="android:style/Widget.Button">
        <item name="android:text">テキストボタン</item>
    </style>

2011年11月19日土曜日

ScrollView内でもフリック動作

ScrollView内ではonTouchEventは使えないようなので、
変わりにdispatchTouchEventを使う。

両方置いた場合、onTouchEventも動いている様でした。

画面を指でなでて画面遷移(移動)


フリック動作で画面遷移

GestureDetecotorクラスのインスタンス
タッチイベント
onFling

package com.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.SimpleOnGestureListener;

public class Test01Activity extends Activity {
    private GestureDetector myGestureDetector;

 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        myGestureDetector = new GestureDetector(new MyGestureListener());
    }
    
 @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (myGestureDetector.onTouchEvent(event))
            return true;
        else
            return false;
    }

 private class MyGestureListener extends SimpleOnGestureListener {
        @Override
        public boolean onFling(
                MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
           
            //float dX = e2.getX() - e1.getX();
            //float dY = e2.getY() - e1.getY();
            //Log.d("タグ",  String.valueOf( dX ) );
            
            Intent subactivity = new Intent(Test01Activity.this, com.test.SubActivity.class);
            startActivity(subactivity);
            
            return false;
        }
    }

    
}

プリファレンスの利用方法

プリファレンスは、データを、キー名と値の組み合わせでxmlファイルに保存する。
ファイルは/data/data/アプリケーション名//shared_prefs フォルダに作成されている。
リファレンス

プリファレンスの保存方法
SharedPreferences pref =
  getSharedPreferences("fileName",MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
  Editor e = pref.edit();
  e.putString("key", "value");
  e.commit();

取得する時は
getString(String key, String defValue);
getInt(String key, int defValue);
getLong(String key, long defValue);
などを使う

プリファレンスの取得方法
SharedPreferences pref =
  getSharedPreferences("fileName",MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
String str = pref.getString("key", "");//キーの値、取得出来なかった解きの値
Log.d("str", str );

他のアプリケーションのプリファレンスの取得方法
String str = null;
try {
 Context ctxt = createPackageContext("com.gyousei", 0);
 SharedPreferences pref = ctxt.getSharedPreferences("pref",
   MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
 str = pref.getString("key", "");//キーの値、取得出来なかった解きの値
} catch (NameNotFoundException e) {
 e.printStackTrace();
}
Log.d("タグ", str);

2011年11月18日金曜日

dispatchKeyEventでの入力検出

下記コードはハードウェアキーボードの入力しか受け取れない。

public boolean dispatchKeyEvent(KeyEvent event) {
 if (event.getAction() == KeyEvent.ACTION_UP) { // キーが離された時
  Log.d("入力", String.valueOf( event.getKeyCode() ));
    }
    
    return super.dispatchKeyEvent(event);
}

EditTextでの入力検出

下記コードはハードウェアキーボードの入力しか受け取れない。

EditText editText1 = (EditText)findViewById(R.id.editText1);

editText1.setOnKeyListener(new OnKeyListener() {    
    public boolean onKey(View v, int keyCode, KeyEvent event) {
     if (KeyEvent.ACTION_DOWN == event.getAction()) {
            //solveExpression();
      Log.d("入力", String.valueOf( event.getKeyCode()));
            return true;
        }
  return false;
    }
});

ソフトキーボードの入力を受け取りたいのでaddTextChangedListenerを使った方法も
次は試してみようと思います。

2011年11月17日木曜日

xmlファイルの斜体が見にくいので設定

ウインド-設定から順番に選んで斜体のチェックボックスを外す。


値の設定-setText

        TextView textView = (TextView) findViewById(R.id.editText1);
        textView.setText("設定する文字列");

現在の時刻をミリ秒で取得

1970年1月1日からのミリ秒を取得できます。


        //現在の時刻を取得
        long startTime = System.currentTimeMillis();
        Log.d("タグ",  String.valueOf(startTime));//1321464077988と表示される


日付フォーマットで表示
        //現在の時刻を取得
        //現在の時刻を取得
        long startTime = System.currentTimeMillis();
        Date date = new Date(startTime);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd.HH:mm:ss SSS");//
        Log.v("タグ", simpleDateFormat.format(date));//2011.11.17.02:53:38 217

クラス SimpleDateFormat

2011年11月16日水曜日

ローカルファイルの読込み方法

ローカルファイルの書込み方法で作成したファイルを読み込んでいます。


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FileRead();
 }

 // ファイルを読み込むメソッド
 public void FileRead() {
  try {
   InputStream in = openFileInput("a.txt");
   BufferedReader reader = new BufferedReader(new InputStreamReader(
     in, "UTF-8"));
   String s;
   while ((s = reader.readLine()) != null) {
    Log.d("タグ", s);
   }
   reader.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }