ラベル tips の投稿を表示しています。 すべての投稿を表示
ラベル tips の投稿を表示しています。 すべての投稿を表示

2012年5月7日月曜日

android ファイル操作の種類



通常のファイル格納領域
アクセス許可さえあれば、javaのファイルアクセスAPIを用いてアクセス可能
例)Fileクラスのdelete()など

※注 sdcard へのアクセスはマニフェストにパーミッションの追記が必要
(パスは、/sdcard, /mnt/sdcard/など。端末依存?)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
★sdcardだけでなく、内蔵diskへのアクセスも↑が必要だった★

■アプリケーション配下のファイル格納領域
android側で独自に定義されたAPIを用いる
openFileOutput(ファイル名, モード)/openFileInput(ファイル名)/deleteFile(ファイル名)

・「data」デレクトリ
/data/data/パッケージ名/files
アプリケーション専用のデータ領域
/data/data/パッケージ名/database
データベース
/data/data/パッケージ名/shared_pref
Preferenceを格納

・「assets」デレクトリ
読み込み専用
assetsディレクトリを作成して保管したファイルを読み込む事が可能
ResourcesクラスのopenRawResource(R.raw.ファイル名)や
例)AssetManager.oepn(ファイル名)など

・「raw」デレクトリ
読み込み専用
リソースIDを指定してのファイル読み込みが可能
例)getString(リソースID)や、ResourcesクラスのgetString(リソースID)など

■参考

2012年1月31日火曜日

AIDLによる Service ⇔ Activity間通信


●AIDLとは?
→android上でプロセス間通信を行うためのもの
 Service側に実装されたコールバック用のインターフェースを
 Activityが受け取ることで、Serviceの処理を呼び出すことが可能
 逆に ServiceからActivityのメソッドも呼び出せるらしい? ★ 要調査
 最初のテンプレートさえ覚えておけば、使い方は特に問題なさそう

1.AIDLファイルの作成
拡張子 .aidl のファイルを作成し、その中に下記のようにインターフェースを書く
javaソースと同じフォルダに置く

 
interface IServiceMethod
{
void CallServiceMethod();
}

2.サービスの実装

class MyService extends Service implements IServiceMethod
{
    @Override
    public IBinder onBind(Intent intent) {
        if(IServiceMethod.class.getName().equals(intent.getAction())){
            // IServiceMethodのインスタンスを返す
            return isvc;
        }
        return null;
    }

private IServiceMethod.Stub isvc = new IServiceMethod.Stub()
{
public void CallServiceMethod() throws RemoteException {
// Service側で実行する処理を実装
}
};
}

ビルドすると gen フォルダに自動生成された IServiceMethod.javaが出来る。
中身を見ると、Stub という名前の内部抽象クラスがあり、.aidl ファイルで宣言したメソッドが定義される。
このインターフェースを実装した Stabクラスのインスタンスを bind時に返せばOK。


3.Activityの実装
 
public class IPCMain extends Activity {

IServiceMethod aidl = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // MyServiceにbindする
        Intent i = new Intent(this, android.study.kai.MyService.class);
        bindService(i, serviceConnection, BIND_AUTO_CREATE);
    }

    @Override
    public void onDestroy()
    {
    super.onDestroy();
    // MyServiceからアンバイド
    unbindService(serviceConnection);
    }

    private ServiceConnection serviceConnection = new ServiceConnection()
    {
    // サービスとの接続時に呼ばれる
        public void onServiceConnected(ComponentName name, IBinder ibinder)
        {
        // Ibinder インターフェースから、AIDLのインターフェースにキャストするメソッドらしい
        aidl = IServiceMethod.Stub.asInterface(ibinder);
        }

    // サービスとの切断時に呼ばれる
        public void onServiceDisconnected(ComponentName name)
        {
        aidl = null;
        }
    };
}

bindServiceと、unbindServiceを呼び出し、サービスと接続/切断する
Serviceのインターフェースは、bind成功時に呼ばれる
インターフェースから取得できる

●bindService
bindService(i, serviceConnection, BIND_AUTO_CREATE);

引数1: インデント。サービスのクラスを指定する?
引数2: ServiceConnectionの実装を指定する
    ServiceConnectionは、サービス接続、切断時に呼ばれる
    コールバック用のインターフェースである。
    接続時に、onBindで返したサービス側のインターフェースを取得できる
引数3: BIND_AUTO_CREATEを指定することでServiceが未起動の時に起動される

●unbindService
unbindService(serviceConnection);
引数1:ServiceConnectionの実装を指定する

2012年1月29日日曜日

Intentでの値の受け渡し方


Intentクラスに、値を受け渡すためのメソッドが用意されているので
これを用います。

★Set
 
i.putExtra("tag1", mConfig.mIpAddress);
i.putExtra("tag2", mConfig.mPortNum);
i.putExtra("tag3", mConfig.10080);

★Get
 
Intent i = this.getIntent();
boolean enable = i.getBooleanExtra("tag1", false);
String ipAddress = i.getStringExtra("tag2");
int portNum = i.getIntExtra("tag3", 10080);
上記の他にもいろいろあります。 ※Serviceの場合は、getIntent()がないのですが、onStartメソッドの引数で取得できます。

Notification

1.NotificationManager を取得する
 
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
2.Notificationオブジェクト生成
 
Notification notification = new Notification(
android.R.drawable.btn_default,
"通知情報が届きました",
System.currentTimeMillis());

・Notificationクラス
→通知情報のコンテキスト
 サウンド、バイブレーション、LEDを用いてアラートする事も
 引数1 icon 一覧に表示するアイコンID
 引数2 text 表示するテキスト
 引数3 表示する時間

3, PendingIntentを用意
 
Intent intent = new Intent(Intent.ACTION_VIEW);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
・PendingIntent
Intentを、タイミングを指定して発行することができるIntent。
時間を指定したり、イベント発生時に発行する。

4.通知情報の設定
 
notification.setLatestEventInfo(
getApplicationContext(),
"アプリ名",
"通知情報の説明文",
contentIntent);

5.一旦、Notificationを削除
 
nm.cancel(id)
6.Manager経由でNotify発行
 
nm.notify(R.string.app_name, notification);

2011年12月19日月曜日

ステータスバーに進捗を表示する


1.OnCreate()と、SetContentView()の間にプログレスバーの許可を書く

// プログレスバー許可
requestWindowFeature(Window.FEATURE_PROGRESS);


2. SetContentView()後に、まずはプログレスバーをOFFにしておく

// プログレスバー表示の設定
setProgressBarVisibility(false);

3.以下のメソッドで、プログレスバーを操作

引数は、 0 - 10000 の範囲で進捗を通知する。
10000になるとプログレスバーが消える

setProgress();

以上!

2011年12月18日日曜日

オプションメニューの作り方


使い方は、Activityのメソッドをオーバーライドする方式なので簡単。

○説明
menu.addメソッドでメニューを追加する。
・2番目の引数のMENU_ID01にメニューIDを指定する。Menu.FIRSTから順番に指定していけばOK
・4番目の引数に、メニュー名を指定する 
 
@Override
// オプションメニュー生成時のイベント
public boolean onCreateOptionsMenu(Menu menu)
{
 // オプションメニューを生成、追加する
 MenuItem item = menu.add(Menu.NONE, MENU_ID01, Menu.NONE, "SampleMenu");
 // アイコンを設定する
 // android.R.drawable内にシステムデフォルトのアイコンが多数用意されている
 item.setIcon(android.R.drawable.ic_menu_preferences);
 // キーボードショートカット
 item.setAlphabeticShortcut('e');
 return super.onCreateOptionsMenu(menu);
}

@Override
// オプションアイテムクリック時のイベント
public boolean onOptionsItemSelected(MenuItem item)
{
 switch (item.getItemId())
    {
    case MENU_ID01:
     // メニューが選択されたときの処理
     break;
    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

@Override
// オプションメニューが閉じられたときのイベント
public void onOptionsMenuClosed(Menu menu)
{
}

2011年7月18日月曜日

Preferenceの使い方

androidでは、アプリケーションなどの設定情報はXMLファイルとして保存される。
これを簡単に読み書きできる方法がある。

やり方:
1. res/xml 配下に、preferences.xmlを追加する
2. ルートタグ preferencescreen とした、設定用のXMLファイルを記述する
3. PreferenceActivityを継承した、Preference専用のアクティビティを作り
 addPreferencesFromResource()で、先ほど追加したXmlファイルのリソースを指定する
Preference取得方法:
4. PreferenceManager.getDefaultSharedPreferences から、SharedPreferencesを取得する
5. preferences.xmlに指定した key となる文字列を引数にして、設定値を取得する


これだけで実現できる。なんとも便利だ。
あとは、PreferenceScreenのxmlファイルを、書式に沿った書き方をすれば、
チェックボックスや、リストボックスや、テキストボックス等
結構色々な形式での入力方法をサポートしている。

PreferenceCategoryタグでくくることで、カテゴリ分けも可能
以下は、チェックボックスと、テキストボックスを含むpreferences.xmlファイル




 
 

 



以下は、Preferenceの取得コード
引数の2番目には、取得が失敗した時のデフォルト値が入る。


SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
boolean jspEnable = pref.getBoolean("checkbox", false);
string url = pref.getString("url1", "http://google.co.jp");

以下は、Preference用のアクティビティ

public class Preference extends PreferenceActivity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.preferences);
 }
}

2011年7月12日火曜日

アクティビティの作成方法

1.ファイル→新規→クラスから android.app.Activity
を継承させたクラスを作成する

2.AndroidManifest.xmlを編集し、アクティビティを追加する。

↓パッケージ名が同じ階層なら以下のような形で記載する

<activity android:name=".ClassName"
 android:icon="@drawable/icon"
 android:label="@string/app_name">
</activity>

マニフェストへの追加を忘れないこと!