2012年07月05日


呼び出し元にバッテリー残量を知らせるアクティビティ

呼び出し元は、startActivityForResult で呼び出して、onActivityResult で結果を受け取ります。呼び出し元には返していませんが、バッテリーの情報が入った intent 内のキーの一覧をログに表示しています

ファイルに書き込んでいるのは特別な場合のデータの受け渡しの為に用意しています。例えば、データを戻したい相手が AIR ベースの拡張を使っていて、こちら側を呼び出した場合に直接イベントによる受信ができない場合です。その場合はタイマーあるいはフォルダの監視で取得する事を想定しています。
package jp.winofsql.app02;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

public class BatteryChangedActivity extends Activity {
    private static final String TAG = "Battery";
    private static final boolean D = true;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        if(D) Log.i(TAG, "+++ ON CREATE : 初回の開始 +++");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    @Override
    protected void onResume() {
        if(D) Log.i(TAG, "--- 再開 ---");
        super.onResume();
        
        IntentFilter filter = new IntentFilter();
        
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(mBroadcastReceiver, filter);
    }

    @Override
    protected void onPause() {
        if(D) Log.i(TAG, "--- 一時停止 ---");
        super.onPause();
        
        unregisterReceiver(mBroadcastReceiver);
    }

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        	// バッテリーの情報が入った intent 内のキーの一覧
            Bundle bundle = intent.getExtras();
            Set<String> set = bundle.keySet(); 
            Iterator<String> it = set.iterator();
            while (it.hasNext()) {
            	if(D) Log.i(TAG, it.next());
            }
            
            // バッテリー残量の取得
            int level = intent.getIntExtra("level", 0);
            if(D) Log.i(TAG, Integer.toString(level));
            // Activity の呼び出し元へデータを戻す
            BatteryChangedActivity.this.setResult(level);

        	try {
        	    FileOutputStream output = openFileOutput("BatteryLevel.txt", MODE_WORLD_READABLE);  
        	    // 書き込み  
        	    output.write(Integer.toString(level).getBytes());  
                if(D) Log.i(TAG, "--- ファイルへ書き込みました ---");
        	    // ストリームを閉じる  
        	    output.close();
        	    
        		// 他からフォルダを監視する為に読み込み権限を与える(初回用)
        		File file = new File("/data/data/jp.winofsql.app02/files");
        		file.setReadable( true, false );
        	    
        	} catch (IOException e) {  
        		e.printStackTrace();  
        	}
            
            
            if(D) Log.i(TAG, "--- 処理を終了します ---");
            finish();
        }
    }; 
  

}
07-06 10:51:27.828: I/呼び出し3(24048): ------
07-06 10:51:27.898: I/Battery(23912): +++ ON CREATE : 初回の開始 +++
07-06 10:51:27.918: I/Battery(23912): --- 再開 ---
07-06 10:51:27.938: I/Battery(23912): icon-small
07-06 10:51:27.938: I/Battery(23912): scale
07-06 10:51:27.938: I/Battery(23912): present
07-06 10:51:27.938: I/Battery(23912): technology
07-06 10:51:27.938: I/Battery(23912): level
07-06 10:51:27.938: I/Battery(23912): voltage
07-06 10:51:27.938: I/Battery(23912): status
07-06 10:51:27.938: I/Battery(23912): plugged
07-06 10:51:27.938: I/Battery(23912): health
07-06 10:51:27.938: I/Battery(23912): temperature
07-06 10:51:27.938: I/Battery(23912): 50
07-06 10:51:27.938: I/Battery(23912): --- ファイルへ書き込みました ---
07-06 10:51:27.938: I/Battery(23912): --- 処理を終了します ---
07-06 10:51:27.968: I/Battery(23912): --- 一時停止 ---
07-06 10:51:27.988: I/Call(24048): --- ファイル監視の結果 ---
07-06 10:51:27.988: I/呼び出し結果(24048): 50
07-06 10:51:28.019: I/Call(24048): 50
07-06 10:51:28.898: I/Call(24048): --- タイマーの結果 ---
07-06 10:51:28.898: I/Call(24048): 50

※ エミュレータのバッテリー残量の変更は、telnet で接続して power capacity nn (ドキュメントは誤記)

※ 通常 telnet localhost 5554 で接続。
※ Windows7 の telnet は追加でインストールする必要があります





posted by at 2012-07-05 02:15 | Android Java | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します