その「SIMフリー端末」は実質ロックされてないか?

そもそもこんな目的でした.

- 利用者の利便性の向上
- MNPによる新規利用契約者と長期利用契約者の間に生じている不公平感を是正する目的

SIMロック解除に関するガイドライン 総務省

なので, その機種自体の能力として各キャリアの電波を拾えるものとすれば,

フツーに

「購入した端末でドコモでもソフバンでも格安SIMでも挿せば通信・通話できる」

「Appleや海外からSIMフリーの端末買えば国内でも使える」

と思っていました.

最近, iPhone 6s (SIMフリー) 関連の記事がありました.

「ドコモオンライン手続き」から一番下の「SIMロック解除」を選択し、IMEIをペーストします。
そのまま進めばSIMロック解除完了です。

ドコモオンラインショップ購入のiPhone 6sを到着前にSIMロック解除してみた!

簡単すぎて拍子抜け iPhoneのSIMロック解除:日本経済新聞

購入後, ドコモサイトから「IMEI」を入力すると「SIMロック解除」できるという.

ドコモオンラインショップ購入のiPhone_6sを到着前にSIMロック解除してみた!

で「IMEI」.

全ての携帯電話や一部の衛星電話に付与される識別番号。
GSMのネットワークでは、正当なデバイスかどうかを識別するのに使われており、盗まれた携帯電話を使えないようにすることもできる。例えば携帯電話を盗まれた場合、携帯電話会社に電話してそのIMEIの電話でネットワークにアクセスできないようにしてもらうことができる。そうするとその電話はSIMカードを入れ替えても使えなくなる。

International Mobile Equipment Identity - Wikipedia

それぞれの端末(IMEI)によって, 通信キャリアが制限をかけることができたら「SIMフリー」って意味ないのでは?

少し古い記事になるけど.

今回総務省が推進しているのはSIMロックの解除だが、SIMロックと並んでユーザーに不便を敷いているのがIMEI規制ではないかと思う。SIMロックは、携帯端末が特定のキャリアのがSIMでしか動作しないようにする仕組みだが、IMEI規制はキャリア側で端末の固有の製造番号(IMEI)を利用して、特定の端末しか通信させないようにする仕組みだ。SIMロックは端末側、IMEI規制はキャリア側の規制であると言える。

建前上は、IMEI規制は不法に入手された端末の通信を拒否することができるという大義名分があるのだが、実際にはそれ以上の規制が行われている。SIMフリーでは誠実な対応をしてきたドコモも、IMEI規制ではまだまだ誠実さに欠けているのではないかと思う。例えば、iPhone用のSIMを、SIMフリーのAndroid端末に挿しても通信ができないという話もある。これではせっかくのSIMフリー端末も意味がなくなってしまう。

総務省はSIMはフリーの次はIMEI規制にも切り込んでもらいたいと思う。

漢(オトコ)のコンピュータ道: SIMロック解除義務化を受けてひとこと。「土管をくれ、手頃でいいヤツを!」

すなわち, わしがイメージしていた

「SIM入れ替えればどこの通信キャリアでも使える」

には以下の2つの制限が解除されないとならない.

1. SIMロック (端末 -> SIM )
携帯端末が特定のキャリアのSIMでしか動作しないようにするしくみ

2. IMEI規制 (通信キャリア -> 端末)
キャリア側で端末の固有の製造番号(IMEI)を利用して, 特定の端末しか
通信させないようにするしくみ

先ほどの, ドコモサイトの「SIMロック解除」の画面て「IMEI規制解除」のことではないのかな.

このキャリアの行っている「IMEI規制」を現在どうなっているかを確認できるサイトがある.

DoCoMo ネットワーク利用制限携帯電話機確認サイト

Au ネットワーク利用制限携帯電話機照会

SoftBank ネットワーク利用制限 携帯電話機の確認

画面からIMEIを入力すると現在のその端末のIMEI制限状態が確認できる.

◯:
そのキャリアが端末を認識している.
SIM-キャリア間の完全接続.

△:
そのキャリアで販売されたもの.
SIM-キャリア間にほぼ制限はないが, キャリア制限をかけることができる状態

x:
そのキャリアで販売された不正端末. 改修される.

-:
そのキャリアで販売されていない.

やってみた.

gn

...

「振り込め詐欺や不正利用に端末が利用されていないか順次IMEIの確認を行っており、古い機種であろうと新規に一括で購入した端末であろうと、全ての端末について「△」表示でスタートさせている」とのことだ。そのため「確認が取れ次第「◯」表示に切り替わっていく」が、「確認が完了するタイミングは人それぞれ」であり「場合によっては数ヶ月ほど待ってもらう」可能性があるという。

ということらしいが.

「IMEI規制」は「通信キャリアが端末を制限する」ので, 解除するには「通信キャリア」に伝えることが必要.

しかし, 端末を購入したところ(販売元)別に制限解除や確認のサイトがあるので困る.

窓口持ち込みはどうなのか.

他社製品の携帯電話機などをドコモのSIMカードでご利用する際の手続き | お客様サポート | NTTドコモ

他社が販売する携帯電話をソフトバンクで利用する | SIMロック解除、他社製品でのソフトバンクのご利用について確認する | お客さまサポート | モバイル | ソフトバンク

手数料が2-3千円かかる.

まとめてみると,

SIMロックの解除:
SIMフリーな端末を購入する.
※ 分割(期間縛り)にしないと高額.

IMEI規制の解除:
端末(IMEI)を利用するの通信事業者(SIM購入元)で手続きする.
※ 端末代支払状況や機種など制限あり.
※ 他社SIMの場合 手数料あり.

孫さんが以前こんなこと.

「もしSIMロックが外れても、極端に流れが変わることはない」

ソフトバンク孫氏、SIMロック解除に「総務省の意向に従うが、極端に流れは変わらない」 - CNET Japan

なんとなく, ややこしい料金体系のように騙されたような気がするのですが,

気のせいかな.


Chrome CustomTabs 使い方 バックグランド処理で高速に

nexus2cee_stuff_thumb

[I/O 2015] Chrome Custom Tabs Will Add Easy And Rich Web Content To Any App With Chrome Capabilities

サービス経由で「ウォームアップ」,「URL先読み」を行って
高速に開く.

公開されている Googleサンプルのうち利用するヘルパークラスなどは
前回エントリを参照.

 

1. バインド

ウォームアップも同時に行う.
アクテビティのライフサイクルに合わせて.

public class SampleActivity extends AppCompatActivity
        implements CustomTabActivityHelper.ConnectionCallback {

    private CustomTabActivityHelper mCustomTabActivityHelper;

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

        mCustomTabActivityHelper = new CustomTabActivityHelper();
        mCustomTabActivityHelper.setConnectionCallback(this);

    }

    @Override
    protected void onStart() {
        super.onStart();
        mCustomTabActivityHelper.bindCustomTabsService(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mCustomTabActivityHelper.unbindCustomTabsService(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCustomTabActivityHelper.setConnectionCallback(null);
    }

    @Override
    public void onCustomTabsConnected() {
    }

    @Override
    public void onCustomTabsDisconnected() {
    }

}

 

2. プリフェッチ

開くであろうURLが確定した時点でバックグランドで先読み.

mCustomTabActivityHelper.mayLaunchUrl(uri, null, null);

 

3. 起動

前回とほぼ同じ.
タイトル, アニメーションを付けてなめらかな体感に.
R.anim.slide_* はサンプルのものを利用.

CustomTabsIntent customTabsIntent =
    new CustomTabsIntent.Builder(mCustomTabActivityHelper.getSession())
        .setShowTitle(true)
        .setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)
        .setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
        .build();
CustomTabActivityHelper.openCustomTab(this, customTabsIntent, uri, new WebViewFallback());

 

以上をまとめてテンプレート的に

public class SampleActivity extends AppCompatActivity
        implements CustomTabActivityHelper.ConnectionCallback {

    private CustomTabActivityHelper mCustomTabActivityHelper;

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

        mCustomTabActivityHelper = new CustomTabActivityHelper();
        mCustomTabActivityHelper.setConnectionCallback(this);

    }

    private void preFetchUrl(Uri uri) {
        mCustomTabActivityHelper.mayLaunchUrl(uri, null, null);
    }

    private void open(Uri uri) {
         CustomTabsIntent customTabsIntent = 
            new CustomTabsIntent.Builder(mCustomTabActivityHelper.getSession())
            .setShowTitle(true)
            .setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)
            .setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
            .build();
         CustomTabActivityHelper.openCustomTab(this, customTabsIntent, uri, new WebViewFallback());
    }

    @Override
    protected void onStart() {
        super.onStart();
        mCustomTabActivityHelper.bindCustomTabsService(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mCustomTabActivityHelper.unbindCustomTabsService(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCustomTabActivityHelper.setConnectionCallback(null);
    }

    @Override
    public void onCustomTabsConnected() {
    }

    @Override
    public void onCustomTabsDisconnected() {
    }

}

イベントからプリフェッチしてからのオープンすればよい.

しかし「先読みのタイミング」て…

(つづく)

Chrome Custom Tabs を とりあえず数行で使う


Chrome Custom Tabs を とりあえず数行で使う

スマホでブラウザを起動する, っての最近では面倒.

LINEとかメッセージでリンクを送ってくる人とか.

20150910-215123

さりげなく開かずにテキトーな会話を続けたりします.

考えてみると「なんかブラウザって重いしトロい」から.

そこで, 最近登場したのが「Chrome Custom Tabs」というしくみ.

Chrome Custom Tabs - Google Chrome

performance

表示までが非常に高速化されてるようにに見える.

実装しようとサンプルをダウンロードしてみる.

GoogleChrome/custom-tabs-client

アプリ内モジュールやヘルパーやプロセス間の通信など
依存関係があるのでわかりづらい.

とりあえずシンプルにURLを渡すだけでで起動してみたいだけなので以下で.

build.gradle

compile 'com.android.support:customtabs:23.0.1'

サンプル内モジュール customtabs 以下は不要.

コピペするクラス

CustomTabsHelper
KeepAliveService
CustomTabActivityHelper
WebViewFallback

shared というモジュールは作らずベタクラスとしてコピペ.
アプリ内モジュール依存はなしで.

起動

...
Uri uri = Uri.parse("http://google.com/");
CustomTabsIntent customTabsIntent =
    new CustomTabsIntent.Builder().build();
CustomTabActivityHelper
    .openCustomTab(this, customTabsIntent, uri, new WebViewFallback());
...

UIカスタマイズはしない. するならここで.

WebViewFallback#openUri()

    ...
    //Intent intent = new Intent(activity, WebViewActivity.class);
    //intent.putExtra(WebActivity.EXTRA_URL, uri.toString());
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(uri);
    activity.startActivity(intent);
    ...

Chromeアプリ (stable/beta/dev) をインストールしてない場合は,
デフォルトブラウザなどに暗黙的に投げる.

で ?

起動はできる.
が, これだけでは恩恵にありつけない.

20150910-224352

サイト内検索などはできるようにはなるが
「なんかブラウザって重いしトロい」が解消せず.

以下の機能があるという.

Pre-warming of the Browser in the background, while avoiding stealing resources from the application.

Providing a likely URL in advance to the browser, which may perform speculative work, speeding up page load time.

これを使わないと意味ないな...

(つづく)