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>