Raspberry Pi 起動ディスク作成 とインストール

Raspberry Pi 起動ディスク作成

作成に使用したのは Windows ではなく
Ubuntu 12.04 LTS 64bit

必要なものと参考書籍は Amazon で購入

なお、raspberry Pi はケースがなかったのでセットのものを購入

なお Raspberry Pi へのインストールメディアは
SDカードを使う

Raspberry Pi を簡単にインストールできる
OSのインストーラーNOOBSをダウンロードする

URLは
http://www.raspberrypi.org/downloads/

ネットワークインストールか
圧縮ファイルかを選べるけど
圧縮ファイルのほうがネットワークエラーを気にしなくてもいいので
こちらを選択

ダウンロードは Torrent か zip ファイルが選べるので
zip を選択

要領は 1.4GBあるため時間の余裕のあるときに行うのがベスト

次にダウンロードしたディレクトリで

mkdir Raspberry_Pi
cp NOOBS_v1_3_0.zip Raspberry_Pi/
cd Raspberry_Pi/
 unzip NOOBS_v1_3_9.zip 

圧縮ファイルを展開するので、わかりやすいようにディレクトリをつくると作業しやすい

次に SD カードへ書き込む

cp -rp ../Raspberry_Pi/* /media/9016-4EF8/

../ とすれば1つ上のディレクトリになる
• は全部という意味

media のところはSDカードなので
これは環境により異なる

Raspberry Pi のインストールするときには
本体以外に
キーボード
マウス
ディスプレイ
HDMIケーブル
MicroUSB ケーブルが必要になる

今回、デスクトップ Ubuntu 14.04 LTS で使っている
有線のマウスとキーボードを使い
HDMIについては AppleTV で使っていたものを使用

電源となる MicroUSB については
Android の Nexus 7 で使っているものを使用

電源をいれるときの注意点として
最初にSDカードをさした状ED態で電源をいれること

とはいっても電源ボタンはなく
MicroUSB をさすと電源がONになる

面倒なのは電源OFFが抜くのはダメということ
ちゃんとシャットダウンしないと壊れる

電源をいれると、OSインストール画面がでる
今回は
Raspbian [RECOMMEND]
を選択

そしてinstall をクリックすると確認ダイアログがでるので yes を選択

これでインストールされる
注意点としては
Raspberry Pi 本体にインストールするのではなく
SDカードにインストールしているということ

USBとかCDブートのLinux を体験しているとわけりやすい

このため別のOSを起動したいのなら
SDカードを差し替えればいい

インストールが完了したら再起動

再起動するとセットアップオプションが起動する

ちなみに、この画面ではキーボードしか使えない
しかもメニューは全部英語

まず最初に一番上の
Expand Filesystem
について

これはSDカードの領域拡張
これをやらないとどれだけ大きいSDカードを使っても
要領が数百MBしか使えない

これはNOOBSでインストールしたならデフォルトで実行されているので、やらなくていい

次に
Advanced Option について
これを選んで Overscan を設定すると画面の表示を変更できる
デフォルトは Enable
Disable にするとフルスクリーン表示になる
これは画面の大きさにより設定を変える

もし大画面のモニターなら デフォルト設定でOK
画面が小さいなら Disable にすると改善されるかも

次に
Internationallsation Options の
Change Keyboard Layout
でキーボードの種類を設定

私の場合一般的な windows キーボード形式なので
keyboard model では
Gerneric 105-key (intl)PC

keyboard layout では
Other を選択

Country of origin for the keyboard では
Japanese を選択

これで日本語キーボードを使えるようになるので
再び keyboard layout で
Japanese (DADG 109A)を選択

key to function as AltGrでは
The default for the keyboard layout
を選択

Compose key では
No compose key を選択

次の画面で
ctrl + Alt + Backspace でデスクトップを終了する設定をするか聞かれるので
yes を選択

これでキーボード設定ができたので
次にパスワードの変更

Raspberry pi の
ユーザは pi なので
このパスワードを変更するには
Change User Password
で設定する

入力したパスワードは表示されないけど
設定は反映されている

次に言語の設定
これは
Internationallsation Options の
Change Locale で設定

デフォルトは
en_GB_UTF-8

日本語にするには
ja_JP .EUC-JP EUC-JP
ja_JP .UTF-8 UTF-8
のところでスペースを押してチェックをつけ
OKをおす

次にデフォルト言語設定だけど
初期段階では日本語フォントがないので
選ぶと文字化けする
なので、ここでは en_FB/UTF-8 を選択

これで初期段階の言語設定は完了

続いて時間の調整
タイムゾーンを設定するので
Internationallsation Options の
Change Timezone を選択

Asia > Tokyo で設定

とりあえず初期設定はこれで終わりなので
Finish を選択する

これで設定が完了する

設定そのものは
あとでログインして

sudo raspi-config

で再度設定できる

次にログイン方法

ログインするときには
ユーザ名 pi
そして設定したパスワードでログインできる

今回はすでにログイン済みなので
そのまま終了処理を行う

Raspberry Pi の起動は MicroUSB へさすだけだけど
終了はコマンドなどでしっかり行う必要がある

終了コマンドは

sudo shutdown -h now

という Linux ではおなじみのコマンド

終了したかどうかを調べるには
Raspberry Pi 本体の
PWR のLEDが点滅していないのならOK

赤く光っているのは通電しているのを示しているので
MicroUSB がささっている間はずっとついている

これは問題ないので気にせず電源OFFでOK

Activity同士での連携

Activity同士での連携

Activity同士の連携は
startActivityForResult()

OverrideしたonActivityResult()で行う

startActivityForResult()で起動先のActivityを開始すれば
onActivityResult()で処理結果を受け取れる

処理結果は、起動先のActivityを終了したタイミングで呼び出される

まず、起動元Activityを実装する
ここで、startActivityForResult.によるActivityの開始
起動先のActivityから処理結果を受け取るonActivityResult()を実装する

まず、リクエストコードは定数宣言しておく

private static final int REQUEST_CODE = 1;

次に、ボタンを押してActivity連携したいので
onClick()をOverrideする

@Override
public void onClick(View v){
//呼び出す画面Intent作成
final Intent intent = new Intent(MainActivity.this, SendActivity.class);

//Intentのキーに文字列設定
EditText inputString = (EditText)findViewById(R.id.input);
String value = inputString.getText().toString();
input.putExtra("key_name",value);

//戻り値を取得できる呼び出し方法でActivity開始
startActivityForResult(intent, REQUEST_CODE);

}

次に、onActivityResult()のOverride

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){

super.onActivityResult(requestCode,resultCode,data);

//startActivityForResult()実行時の引数に指定したRequestCodeを比較する
if(requestCode == REQUEST_CODE){

//Activity終了時のフラグ判定
if(resultCode == RESULT.OK){

//戻り値として設定された key_nameの値を取得
String value = data.getStringExtra("key_name");

EditText result = (EditText)findViewById(R.id.result);
result.setText(value);
}
}
}

これで、元はできたので起動先のActivityを実装

起動先のActivityでは
Intent経由でパラメーターを受け取る

起動元のActivityへ処理結果を返すので
setResult()を使う

まずは、Intentで渡されたデータがあるか判定
!= nullなら中身ありなので、文字列を取得

Intent intent = getIntent();
if(intent != null){

//渡された文字列を取得
String sendvalue = intent.getStringExtra("key_name");
EditText getString = (EditText)findViewById(R.id.inputString);
getString.setText(sendvalue);
}

そして、起動元へ結果を送る処理の実装

findViewById(R.id.backActivity)setOnClickListener(
new  onClickListener(){

@Override
public void onClick(View v){

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

//戻り値に文字列が設定されている場合、戻り値を設定
if(result.getText().length() > 0){

//戻り値のためのIntent作成
Intent data = new Intent();

//戻り値設定
data.putExtra("key_name",data.getText().toString());

//成功とさて設定
setResult(RESULT_OK, data);
}
//Activityの終了
finish();
}
});

Activityから別のActivityへパラメーターを渡すには
Intentにパラメーターを設定する

Intentは仲介役みたいなかんじ

Intentを受け取るには
getIntent()で受け取れる

なお、別のActivityを呼び出して、そこの結果を受け取りたいのなら
startActivityForResult()を使う

startActivityForResult()を使うことで
呼び出したActivityが終了したときに
onActivityResult()が呼ばれるので
setResult()で設定したIntentを戻り値として取得できる

注意点としては
startActivityForResult()は
onRestart()より前に呼ばれるので
処理のタイミングに注意すること

最近使ったアプリに表示されないようにするには

最近使ったアプリに表示されないようにするには

最近使ったアプリ一覧に表示したくない場合
android.intent.action.Mainが指定されている
メイン画面のactivity要素へ
excludeFromRecents=”true”
を追加する

注意点として
サブ画面のactivity要素へ
excludeFromRecents=”true”
を設定しても有効にはならないので注意

回転してもActivityを破棄しないようにする

回転してもActivityを破棄しないようにする

通常は、画面回転時にはActivityは破棄されてから再生される

このとき、Activityを破棄しないようにするためには
AndroidManifest.xmlの

android:configChanges=””
を指定する

android:configChanges="orientation|screenSize"

また、回転時に処理をしたいのなら
Javaで
onConfigurationChanged()

overrideする

@Override
public void onConfigurationChanged(Configuration newConfig){
Log.i(TAG, "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
}

アクションに対応するアプリの一覧を取得

アクションに対応するアプリの一覧を取得

これは、暗黙的インテントで呼び出せるアプリの一覧を表示できる

パッケージ名も取得できるため
明示的インテントのときにも使える

アクションに対応するアプリ一覧を取得するには
PackageManagerの
queryIntentActivities()を使えば、
引数に指定したIntentの情報にマッチするActivity一覧を取得できる

ACTION_VIEWアクションに対応するアプリ一覧を取得したいのなら

PackageManager pg = getPackageManager();

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);

List<ResolveInfo> activities = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

これで、一覧が表示される

インストールされているアプリ一覧の取得

インストールされているアプリ一覧の取得

アプリのバージョン取得したり
アクションに対応するアプリの一覧作成に使う

インストールされているアプリ一覧を取得するには
PackageManagerの
getInstalledApplications()
を使う

アプリ一覧を取得するソースは

PackageManager pg = context.getPackageManager();
List<ApplicationInfo> appInfoList = pm.getInstalledApplications(PackageManager.GET_META_DATA);

これで、ApplicationsInfoの中にアプリに関する様々な情報がふくまれる

そして、アプリ名の取得

アプリ名を取得するには
PackageManagerの
getApplicationLabel()の引数に
ApplicationsInfoインスタンスを渡すことで取得できる

String appLabel = pm.getApplicationLabel(appInfo).toString();

これで、インストールされているアプリ名がわかるようになる

アプリのバージョン取得

アプリのバージョン取得

インストールされているアプリ一覧を取得したり
アクションに対応するアプリ一覧を作成するときに使う

アプリのバージョンを示す
versionCode
versionName

PackageInfoクラスの
versionCode/versionNameプロパティから取得できる

なお、例外発生もあるので
try~catchで処理を行う

PackageManager pm = getPackageManager();

int versionCode =0;
String versionName="";

try{
PackageInfo packageInfo = pm.getPackageInfo(getPackageName, 0);

//AndroidManifest.xmlの versionCode
versionCode = PackageInfo.versionCode;

//AndroidManifestでのversionName
versionName = packageInfo.versionName;

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

versionNameは自由に文字列を指定できるけど
versionCodeには数値しか入らない

また、アプリをインストールするときには
現在インストール中のアプリの
versionCodeより低い値では上書きすることができない

チェックするところは
AndroidManifest.xmlの

android:versionCode="1"
android:versionName="1.0"

のところ

スワイプで切り替わるが画面の作成

スワイプで切り替わるが画面の作成

いくつかのページがある場合
左右にスワイプで切り替えできると便利

スワイプで切り替わる画面を作成するには
ViewPagerクラスを使う

そして、表示するFragmentは
FragmentPagerAdapterを継承したクラスへ作る

まずは、レイアウト定義のファイル作成

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

<android.support.v4.view.viewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.viewPager>

</LinearLayout>

次に、PagerAdapterを継承したクラスを作成

これは、画面が切り替るタイミングで
Fragmentを生成する FragmentPagerAdapterクラスを作成する

まずは、レイアウト定義

<LinearLayout 
xmlns:android="http://scheams.android.com/apk/res/android"
xmlns:ads="http://scheams.android.com/apk/lib/com.google.ads"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<android.support.v4.view.viewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</android.support.v4.view.viewPager>

</LinearLayout>

次に、PagerAdapterを継承したクラスの作成

画面が切り替わったタイミングで
Fragmentを生成するFragmentPagerAdapterクラスを作成する

public static class ViewPagerAdapter extends FragmentPagerAdapter{

private String[] values = new String[]{"page1","page2"};

public ViewPagerAdapter(FragmentManager fm){
super(fm);
}

@Override
public Fragment getItem(int position){
ViewPagerFragment fragment = new ViewPagerFragment();

Bundle args= new Bundle();
args.putString("value", values[position]) ;
fragment.setArguments(args);
return fragment;

}

@Override
public int getCount(){
return values.length;
}
}

長さ取得には lengthを使うと便利

次に、ViewPagerクラスへPagerAdapterクラスをセット

最初に、部品のインスタンスを取得してセットする

今回はonCreate()の中でやる

mAdapter = new ViewPagerAdapter(getSupportFragmentManager());

mPager = (ViewPager)findViewById(R.id.pager);

mPager.setAdapter(mAdapter);

これで、スワイプで切り替わる画面ができる

もし、大量のページがあるなら
FragmentPagerAdapterの代わりに
FragmentStatePagerAdapterを使う

レスポンスは悪くなるけど
ページが表示されなくなると破棄するため
メモリ節約になる

ナビゲーションドロワーの作成

ナビゲーションドロワーの作成

YouTubeやGmail GoogleMapなどの
Googleが作っているアプリのほとんどが
画面端からメニューを引き出して操作するようになった

このような画面の端からスライドして引き出すメニューのことを
ナビゲーションドロワーという

英語だとNavigationDrawer

ちなみに、NavigationDrawerは
Android標準機能ではなく
Android Support Libraryで提供されている仕組みになる

なので、自分のプロジェクトのlibsディレクトリへ
android-support-v4.jar
を追加する

また、NavigationDrawerの実装には
NavigationDrawerがあることを示すマーク画像
スライドメニューの影画像が必要になる

とはいっても
NavigationDrawerのサンプルがあるので
それをダウンロードして自分のアプリに設置すればok

ダウンロードURLは
http://developer.android.com/training/implementing-navigation/nav-drawer.html

ここで、Download the sample app
をクリックし、ダウンロード

ダウンロードした圧縮ファイルを解凍すると
NavigationDrawerフォルダができるので

その中の
res/drawable-xhdpiディレクトリの中に
drawer_shadow.9.png

oc_drawer.png
があるので
これをプロジェクトの
res/drawable-xhdpi/
へコピーする

他の解像度のディレクトリにも入れれば
それぞれの端末画像でも綺麗に表示される

次に、レイアウトファイルへの追加

Activityのレイアウト定義の一番下へ
DrawerLayoutを書く

そして、その中に画面のメインレイアウトとなるFrameLayoutと
そこで使うスライドメニュー用のレイアウトになるListViewを設定する

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://scheams.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- メインコンテンツレイアウト -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="20sp"/>
</FrameLayout>

<!-- スライドメニュー用レイアウト -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/background_light"/>

</android.support.v4.widget.DrawerLayout>

これでレイアウト定義はできたので
次にJavaでレイアウトの呼び出し

これは、通常のボタンのように
findViewById()で取得する

まずは、パーツの宣言

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private TextView mTextView;

次にonCreate()の中で、各Viewの取得

ちなみに、setupNavigationDrawer()は
自作のユーザー関数

mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
mDrawerList = (ListView)findViewById(R.id.left_drawer);
mTextView = (TextView)findViewById(R.id.text);

setupNavigationDrawer();

そして、NavigationDrawerを使うための設定を
setupNavigationDrawer()へ書いていく

private void setupNavigationDrawer(){

//NavigationDrawerの影を指定
mDrawerLayout.setDrawerShadow(R.drawable/drawer_shadow, GravityCompat.START);
mDrawerList.setOnItemClickListener(this);

//ActionBarの左へDrawerToggleを表示
getActionBar().setDisplayHomeAsUpEnabled(true);

//ActionBarのホームボタンを有効化
getActionBar().setHomeButtonEnabled(true);

//Drawerを開閉したときのイベントを受け取る

mDrawerToggle = new ActionBarDrawerToggle(this,
mDrawerList, 
R.drawable.ic_drawer,
R.string.drawer_open,
R.string.drawer_close){

@Override
public void onDrawerClosed(View v){
}

@Override
public void onDrawerOpened(View drawerView){
}

};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}

次に、DrawerToggleでオプションメニューの選択を検知可能にする

@Override
public boolean onOptionsItemSelected(MenuItem item){
if(mDrawerToggle.onOptionsItemSelected(item)){
return true;
}
return super.onOptionsItemSelected(item);
}

次に、DrawerToggleでオプションメニューの制御

@Override
protected void onPostCreate(Bundle savedInstanceState){
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}

そして、DrawerToggleで上下の変更の制御

@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}

そして、ボタンを押したときの処理

@Override
public void onItemClick(AdapterView<?> adapterView, View parent, int position, long id){
selectItem(position);
}

次に、アイテム選択時の処理

@Override
public void selectItem(int position){
ListAdapter adapter = mDrawerList.getAdapter();
String item = (String)adapter.
getItem(position);

mTextView.setText("選択したアイテム: "+item);

mDrawerLayout.closeDrawer(mDrawerList);
}

これで、NavigationDrawerが作成できる

Androidでタブ画面の作成

Androidでタブ画面の作成

画面でタブ画面を作成すると用途ごとの切り替えができてみやすくなる

クックパッドとか
楽天証券のiSpeedなどがタブ画面をつかっている

画面でタブを使うには
TabWidgetクラス
FragmentTabHostクラス
を使う

まずは、レイアウトファイル作成

<android.support.v4.app.FragmentTabHost xmlns:android="http://scheams.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="horizontal"/>

<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>

</LinearLayout>

</android.support.v4.app.FragmentTabHost>

次に、Javaで
TabWidgetクラス
FragmentTabHostクラスを使い、
画面でタブを使うように
onCreate()へ追記する

mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
mTabhost.setUp(this,  getSupportFragmentManager(), R.id.realtabcontent);

for(String tag:tags){
Bundle bundle = new Bundle();
bundle.putString("value",tag);
mTabhost.addTab(mTabhost.newTabSpec(tag).setIndicator(tag),
TabFragment.class, bundle);
}

これで、タブ追加できる

FragmentTabhostクラスは、
setup()で初期化後、Fragmentをタブコンテンツへ追加できる
そして、setIndicator()でタブのテキストを指定する