2011年6月15日水曜日

iPhone 4のSIMフリー版、米国で発売

 米アップル(Apple)は、同社のオンラインストア「Apple Store」にて、SIMロックフリー版iPhone 4を販売している。販売価格は16GB版が649ドル、32GB版が749ドル。カラーはブラックとホワイト共に用意されている。日本からの購入はできないようだ。

 GSMをサポートする通信業者のサービスが利用可能で、米国のAT&Tのほか、海外の通信業者のサービスを利用できるとしている。micro-SIMカード抜きで販売されており、利用するためにはGSMをサポートするmicro-SIMカードを挿入する必要がある。

Android@Home

 Android@Homeはイニシアチブの名称で、家庭におけるあらゆるデバイスをAndroidアプリケーションから認識し、接続・通信できるようにするとのことです。実はこのようなアイデアはもう何十年も前からあり、昔も今も展示会では必ずと言ってよいほど目にします。長くネット家電と呼ばれ、今年のCESでもLGElectronicsがネット冷蔵庫を展示したり、SamsungはAllShareという家電をつなぐ仕組みを特設ブースを作って熱心に宣伝していました。ただし、これまでのところ、AV機器の相互接続性の向上といったレベルの成果は上がっているものの、残念ながらIT技術によって家電の利便性を根本的に良くするには至っていません。

 このような現状を打破する力が、Android@Homeにはあるのでしょうか。あるかもしれません。なぜそう思えるのか。上述のAndroidに関するパートナーシップが鍵になると考えるからです。SamsungやLG Electronicsをはじめとする大手家電メーカーが、Androidを健全に成長させようとしています。その先には、SamsungやLG Electronicsがそれぞれ描いていたホームコンピューティングの実現も視野に入っているはずです。互いに競合ではありますが、Androidを担いでいるということでは確かにパートナーです。タブレット市場よろしく、ホームコンピューティングを確立させることで大きな市場が拓けるならば、お互いに伸びることが可能になります。そして、アップルという共通の敵に対抗できる有力な方法でもあるのです。

 ともかく、何十年も実現しなかった構想です。Android@Homeの評価も、"近い将来"というスパンでは出せないのかもしれません。技術や社会の変貌が、思わぬ路線変更を強いることもあるでしょう。長い目で、Android@Homeの行く先を見届けましょう。

Androidの方向性

 HoneyCombの新リリースとなる3.1において、Androidの方向性がより鮮明に示されることになりました。目玉は周辺機器接続の強化です。Android端末と接続するUSBハードウェアの規格であるAndroid OpenAccessoryを定め、リファレンス開発キットも用意しました。このため、USB接続機器メーカーは容易に自身の製品をAndroidデバイスに対応させることができるようになりました。ご存じのとおり、USBはPCでは最も一般的な接続インタフェースで、歴史も長いため対応機器の数も膨大です。しかし、有線による周辺機器の接続を良しとしなかったアップルはUSBをiPadに搭載しませんでした。このような両者のポリシーの違いが、獲得するユーザー層や用途にも影響すると考えられます。
 なお、少し前の話題になりますが、インタフェースという点では、非接触近距離無線通信技術の1つであるNFCも見逃せません。携帯電話を中心に広く普及すると見られていますが、特にAndroidデバイスでの採用を見込んで、Open NFCというオープンソースのNFCプロトコルスタックが登場しています。同じく近距離無線ですが実効速度375Mbpsという高い転送率が特徴のTransferJet、センサーネット向けの無線通信技術であるZigBeeなども今後ある割合で一般家庭に普及すると見られます。トータルバランスのような話題は別にありますが、そういったいくつもの新しい技術に対するスピーディーな対応という点でAndroidは勝っています。
 上述の通り、iPadをキャッチアップするためにAndroidは分枝せざるを得ませんでしたが、Ice Cream Sandwichはこの再統合を大きな目的としたリリースとなります。分枝自体が予定外であったわけですから、統合は新しいイベントというよりは分枝の後始末と捉えるべきです。また、Ice CreamSandwichのリリース時にはオープンソースの公開もなされる予定であるとのことでした。HoneyCombはおそらく過渡期のリリースとして扱われ、オープンソースは最後まで公開されないと思われますが、そうして見ると、GoogleはいまだiPadショックの真っただ中にあるといえます。

2011年6月14日火曜日

「iOS 5」用の脱獄ツール「redsn0w 0.9.8b1」が登場

iPhone Dev Team というグループは2011年6月10日、米国 Apple の次期モバイル OS「iOS
5」(ベータ版)に対応した脱獄(jailbreak)ツール「redsn0w 0.9.8b1」(ベータ版)をリリースした。現在 Mac OS X 版と Windows 版を提供している。

同ツールで脱獄可能なデバイスは、iPod touch 3G/4G、iPad、iPhone 3GS、GSM /
CDMA 版 iPhone 4。再起動するつど脱獄処理を行う必要のある、いわゆる「紐付き(tethered)」脱獄のみが行える。

なお、このベータ版は脱獄アプリケーション開発者向けのバージョンであるという。iOS
5のさまざまなコンポーネントを破壊してしまうため、使用には注意が必要だとしている。

「iOS 5」用の脱獄ツール「redsn0w 0.9.8b1」が登場

2011年6月13日月曜日

入力された値を取得

テキストボックスに入力された文字列を取得します。「EditText」クラスで用意されている「getText」メソッドを使います。

getText
public Editable getText()
Return the text the TextView is displaying. If setText() was called with
an argument of BufferType.SPANNABLE or BufferType.EDITABLE, you can cast
the return value from this method to Spannable or Editable, respectively.

Returns:
入力された値
戻り値としてテキストボックスに入力された値を「Editable」インターフェースを実装したクラスのオブジェクトとして取得します。

「Editable」インターフェースを実装したクラスとしては「android.text.SpannableStringBuilder」クラスがあります。「SpannableStringBuilder」クラスは文字列などを内部に持つバッファークラスです。現在のバッファーの内容を文字列として取得するには「SpannableStringBuilder」クラスで用意されている「toString」メソッドを使います。

toString
public String toString()
Return a String containing a copy of the chars in this buffer.

Returns:
バッファーに格納された内容を文字列として取得
具体的には次のように記述します。

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.text.SpannableStringBuilder;

public class Test extends Activity {
@Override protected void onCreate(Bundle icicle) {
super.onCreate(icicle);

EditText edit = new EditText(this);
edit.setHeight(50);
setContentView(edit);

SpannableStringBuilder sb = (SpannableStringBuilder)edit.getText();
String str = sb.toString();
}
}
TextViewクラスの「getText」メソッド

テキストボックスに入力された文字列を取得するには「EditText」クラスの親クラスである「TextView」クラスにもメソッドが用意されています。で用意されている「getText」メソッドを使います。

getText
public CharSequence getText()
Return the text the TextView is displaying. If setText() was called with
an argument of BufferType.SPANNABLE or BufferType.EDITABLE, you can cast
the return value from this method to Spannable or Editable, respectively.

Returns:
入力された値
こちらのメソッドの場合は戻り値として「CharSequence」インターフェースを実装したクラスのオブジェクトとして取得します。単に文字列として取得したい場合にはこちらを使って下さい。

具体的には次のように記述します。

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.text.SpannableStringBuilder;

public class Test extends Activity {
@Override protected void onCreate(Bundle icicle) {
super.onCreate(icicle);

EditText edit = new EditText(this);
edit.setHeight(50);
setContentView(edit);

CharSequence str = edit.getText();
}
}
サンプルプログラム

それでは実際に試してみます。プロジェクトを作成しソースコードを次のように変更しました。

Test05_01.java

package jp.javadrive.android;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.app.AlertDialog;
import android.text.SpannableStringBuilder;

public class Test05_01 extends Activity {
private final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;

@Override protected void onCreate(Bundle icicle) {
super.onCreate(icicle);

LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
setContentView(linearLayout);

TextView tv = new TextView(this);
tv.setText("What's your name?");
linearLayout.addView(tv,
new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));

final EditText edit = new EditText(this);
edit.setWidth(200);
linearLayout.addView(edit,
new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));

Button button1 = new Button(this);
button1.setText("Get Text");
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
AlertDialog.show(Test05_01.this, "Input Name",
edit.getText(), "ok", false);
}
});
linearLayout.addView(button1,
new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));

Button button2 = new Button(this);
button2.setText("Get Text");
button2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
SpannableStringBuilder sb =
(SpannableStringBuilder)edit.getText();
AlertDialog.show(Test05_01.this, "Input Name",
sb.toString(), "ok", false);
}
});
linearLayout.addView(button2,
new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
}
}

Menus

Application menus are another important part of an application's UI. Menus offers a reliable interface that reveals application functions and settings. The most common application menu is revealed by pressing the MENU key on the device. However, you can also add Context Menus, which may be revealed when the user presses and holds down on an item.

Menus are also structured using a View hierarchy, but you don't define this structure yourself. Instead, you define the onCreateOptionsMenu() or onCreateContextMenu() callback methods for your Activity and declare the items that you want to include in your menu. At the appropriate time, Android will automatically create the necessary View hierarchy for the menu and draw each of your menu items in it.

Menus also handle their own events, so there's no need to register event listeners on the items in your menu. When an item in your menu is selected, the onOptionsItemSelected() oronContextItemSelected() method will be called by the framework.

And just like your application layout, you have the option to declare the items for you menu in an XML file.

Read Creating Menus to learn more.

電話をかけるには

インテントアクション「CALL」は、電話をかけるためのインテントアクションであり、

android.contentパッケージ、Intentクラスの定数 Intent.ACTION_CALL として定義されています。

インテントを利用するには、インテントのインスタンスを作成する必要がありますが、ここでは、
インテントのコンストラクタの第1引数に、インテントアクションとして、Intent.ACTION_CALL、

第2引数のUriに、Uri.parse("tel:0123456789")など、tel:で始まる電話番号を指定します。

ソースコード(*.java)
Intent intent = new Intent(
Intent.ACTION_CALL,
Uri.parse("tel:0123456789"));

startActivity(intent);
また、このインテントアクションを利用するためには、マニフェスト(Manifest)ファイルにCALL_PHONEのパーミッションを追加する必要です。

マニフェストファイル(AndroidManifest.xml)
<uses-permission android:name="android.permission.CALL_PHONE"/>

電話をかける画面を表示するには

上記説明のIntent.ACTION_CALLを、Intent.ACTION_DIALに変更することで、
電話をかける手前の段階である、電話をかける画面を表示することもできます。

この場合の、インテントの第2引数は、先と同様ですが、
このインテントアクションのみ利用する場合には、先のCALL_PHONEパーミッションは不要です。

ソースコード(*.java)
Intent intent = new Intent(
Intent.ACTION_DIAL,
Uri.parse("tel:0123456789"));

startActivity(intent);

メニュー(Menu)を使用するには

public class MenuSampleActivity extends Activity {
private static final int MENU_ID_MENU1 = (Menu.FIRST + 1);
private static final int MENU_ID_MENU2 = (Menu.FIRST + 2);
private boolean visible = true;

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

// オプションメニューが最初に呼び出される時に1度だけ呼び出されます
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// メニューアイテムを追加します
menu.add(Menu.NONE, MENU_ID_MENU1, Menu.NONE, "Menu1");
menu.add(Menu.NONE, MENU_ID_MENU2, Menu.NONE, "Menu2");
return super.onCreateOptionsMenu(menu);
}

// オプションメニューが表示される度に呼び出されます
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(MENU_ID_MENU2).setVisible(visible);
visible = !visible;
return super.onPrepareOptionsMenu(menu);
}

// オプションメニューアイテムが選択された時に呼び出されます
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean ret = true;
switch (item.getItemId()) {
default:
ret = super.onOptionsItemSelected(item);
break;
case MENU_ID_MENU1:
ret = true;
break;
case MENU_ID_MENU2:
ret = true;
break;
}
return ret;
}
}

Androidスマホのアプリストア

 Android搭載のスマートフォンはOSが同じなだけに、デザイン以外はどれも似たような製品だと思われがち。でも実際にはキャリアやメーカーごとにサービス面や機能面で細かな違いが存在する。

 そんな細かな違いが、ユーザーにとっては実際の使い勝手で大きな差を感じることになる。そこで本連載では、サービスや端末の機能について、実際にテストした上でネチネチとその違いを探っていく予定だ。ぜひとも端末選びの参考にしていただきたい。

 まずは基本となるグーグル純正のAndroidマーケットでのアプリ購入方法から。Androidマーケットでは無料アプリはGoogleのアカウントさえ登録していれば問題なく入手できるが(逆に言えばGoogleのアカウントは必須)、有料アプリの支払いは「Google checkout」にクレジットカードを登録するのが唯一の方法だった。

 そのためにクレジットカードを持っていない人(もしくは使いたくない人)は有料アプリを購入できなかったほか、肝心のクレジットカードもJCBには非対応と、日本のユーザーにとっては大きな弱点が存在した。

 そこで現在は主要3社とも、携帯電話の料金と一緒に、有料アプリのGoogle checkoutでの支払いができるようになった。これは大きな進化と言えるだろう。

 ただし注意したいのは、このケータイ料金と一緒にしての支払は日本円で提供しているアプリのみに対応という点(これは3キャリアとも同様)。具体的には、Androidマーケットで有料アプリを表示させると、「\99」や「約\161」といった金額が見られるが、後者については外国の通貨(ドルやポンドなど)でアプリの料金が設定されており、Androidマーケット側で円換算での金額を表示しているものだ。

 もっとも現在ではアプリを配信する側が、購入者の現地通貨での価格を個別に設定できるため、海外製アプリでも円建てで請求されるものが増加しており、不便を感じる機会は減っている。

 有料アプリの料金支払いについては1つ大きな課題をクリアした感があるが、それでもキャリアが個別のアプリストアを用意するのには、Androidマーケットのもうひとつの弱点が関わってくる。それが肝心のアプリの探しにくさだ。どのようなアプリストアを展開しているかは3社とも考え方は違う。

 まずシンプルなのはソフトバンク。独自のアプリストアはあえて作ろうとせず、ユーザーにAndroidマーケットそのものを使ってもらおうという発想だ。ただし、Androidマーケットの中に「SoftBankセレクション」として、ソフトバンクが提供するアプリやオススメアプリを選別してアクセスしやすいようにしている。選別したアプリは数も多く、充実している。

 ドコモとauはそれぞれ独自のアプリストアを展開している。しかし中身を見ると、ドコモの場合はアプリだけではなく、さまざまな種類のスマホ向けコンテンツ(ニュースや動画、電子書籍にWebサイト)を集めたポータルサイトである。iモード用のiMENUに近い発想だ。一方auはアプリだけに絞り、Androidマーケットとは異なる、日本のユーザーに特化した本格的なアプリストアを提供している。

                    ドコモ au ソフトバンク
アプリ料金をケータイ料金と一緒に支払える ○ ○ ○
Androidマーケット内に
独自のアプリ紹介エリアを持っている × ○ ○
同エリア内で紹介されているアプリの数 — 25 74
キャリア独自のアプリストアを持っている ○ ○ ×

iPhoneはソフトバンクモバイルを救った

 スマートフォンが「フォン」——つまり「電話機」である以上、そこに通信機能を提供するキャリアの影響力は無視しえない。逆に、商品力のすぐれた端末がキャリアに与える影響も、また絶大なものがある。

 現在、わが国の携帯電話市場で13カ月間連続の純増数(新規契約から解約を差し引いたもの)1位はソフトバンクモバイルだが、iPhoneの販売契約なしにこれを達成できたと考える人はいないだろう。「iPhoneがソフトバンクモバイルというキャリアを救った」とさえ言えるかもしれない。

 これはiPhoneの商品力が高いことの「証」であり、ここまでの商品力を持つ製品はまれである。スマートフォン市場では米国GoogleのAndroid OSを搭載した端末の販売台数がiPhoneを上回ったと言われるが、それは総計の話であり、単独の製品としてiPhoneを越えたわけではない。

 もしAppleがiPhoneのOSであるiOSをサードパーティにライセンスしていたとしたら、Android端末のシェアがこれほど高くなることもなかっただろう。同様に、Appleが幅広いキャリアにiPhoneを提供していたら、ソフトバンクモバイルの快進撃はなかったハズだ。

Windows Embedded Standard 7 SP1でアップデートされた機能

 マイクロソフトのデスクトップPC向けOSの最新版「Windows 7」のService Pack 1(以下、SP1)が提供されたことに伴い、Windows 7をベースとする組み込みOSWindows Embedded Standard 7(以下、WES7)」でも、SP1に対応したバージョンがリリースされました。

 

 WES7 SP1には、ToolkitのアップデートとWindows 7 SP1で提供される900以上のHotfixおよびSecurity Updateの全てが含まれています。マイクロソフトのWebサイトの「Windows 7およびWindows Server 2008 R2 Service Pack 1のドキュメント」に、HotfixおよびSecurity Updateのリストが公開されていますので、詳しく知りたい方はこちらをご覧ください。

 

Windows Embedded Standard 7 Service Pack 1のダウンロード(Windows Embedded Free Trial

http://www.microsoft.com/windowsembedded/en-us/downloads/download-windows-embedded-standard-7-trial.aspx

 

Windows 7およびWindows Server 2008 R2 Service Pack 1のドキュメント

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=61924cea-83fe-46e9-96d8-027ae59ddc11&displaylang=en

 

 なお、WES7WES7 SP1Distribution Share(以下、DS)は、共存させることが可能です。表1にデフォルトのDS格納先を示します。

 

WES7x86      (インストール先フォルダ)\DS

WES7x64      (インストール先フォルダ)\DS64

WES7 SP1x86             (インストール先フォルダ)\DS SP1

WES7 SP1x64             (インストール先フォルダ)\DS64SP1

 

 

1.新しいバージョンの「Remote Desktop Protocol」に対応

 

 シンクライアント端末などの開発では、Remote Desktop Connection機能を搭載することが多いと思いますが、この機能で使用される「Remote Desktop Protocol」のバージョンが、WES7 SP1で"7.1"となり、「Remote FX」に対応しました。

 

 Remote FXに関する詳細な解説はここでは割愛しますが、一言でいうと「リモートデスクトップ機能を拡張するもの」です。Windows Server 2008 R2 SP1を使用したデスクトップ仮想化環境において、3Dレンダリングの性能向上や、クライアント側接続USBデバイスのリダイレクト機能(RemoteFX USB Redirection)などが提供されます。

 

関連リンク:

           Remote Desktop ServicesTerminal Services Team Blog

 

2SDカードブートへの対応

 

 Embedded Enabling Featureパッケージの1つとして、WES7 SP1では、SDカードからのブートが可能となる「SD Bootパッケージ」が追加されました。

 

 SDカードブートの実現により、HDDと比べ"省スペース化""省電力化"が期待できます。ただし、ハードウェアおよびBIOSSDカードからのブートをサポートしている必要があります。

 

 なお、SD Bootの使用には"ライセンス上の制限"がありますのでご注意ください。

3SKUのサポート

 

 WES7 SP1から、新しく「SKU Complianceパッケージ」が追加されました(図1)。

 

 WES7には、3種類のランタイムライセンス(SKUStock Keeping Unit/製品構成)が存在し、それぞれで使用できるパッケージ(機能)が限定されています。

 

 今回追加されたSKU ComplianceパッケージをOSイメージに含めておくと、購入したライセンスで使用してはならないパッケージを自動的に検知してくれます。

 

 なお、WES7 SP1SKUと使用できるコンポーネントに関しては、Webサイトに詳細が記載されていますので、ご確認ください。

 

Windows Embedded Standard 7 SP1 OS Components

http://www.microsoft.com/windowsembedded/en-us/develop/windows-embedded-standard-7-os-components.aspx

 

4.「Windows Embedded Developer Update」について

 

 「Windows Embedded Developer Update(以下、WEDU)」は、WES7ToolkitおよびDistribution Shareを更新するツールです。

 

 現在、WES7 SP1に対応したWEDU 1.1がリリースされています。Webサイトからダウンロード可能です。

 

Windows Embedded Developer Update 1.1

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=83B4DC0F-BBA4-4B97-AD83-E852A5E2C142&displaylang=en

 

 また、WES7用のWEDU 1.0をインストール済みの場合は、Windows Update経由で更新することも可能です。

 

 使い方はとても簡単です。まず、左側のツリーから[Windows Embedded Standard 7]を選択し、右側のリストで「Distribution Share」フォルダを登録します。

 

 次に、左側のツリーから[Registered Products]を選択し、[Check for Updates]ボタンをクリックすると、ToolkitもしくはDistribution Shareに対するアップデートのチェックがインターネット経由で行われます。

 

 アップデートがあれば、左側のツリー内にそれぞれアップデートの個数が表示されます。ツリーでアップデートが存在する項目を選択すると、右側のリストにアップデートの一覧が表示されます。インストールするアップデートを選択し、[Download and Install]ボタンをクリックするだけで、自動的にダウンロードとインストールが行われます。

 

 なお、このセキュリティアップデートは、[Validate]メニューの[Add Required Packages]を実行しても、Answer Fileに自動的に追加されませんのでご注意ください。Answer Fileに含める場合は、通常のパッケージ同様、右クリックメニューの[Add to Answer File]を選択するなど、手動で追加する必要があります。