2013年1月31日木曜日

Android データ通信ON/OFF切替

いままでAndroid端末はWiFiでだけ使っていた(電話とメールはガラゲー)が、
先月から1台に集約した。
すると、LTE(または3G)からWiFiに切り替えるとき、
データ通信をOFFしようとすると階層が深くてなかなか面倒くさいのだ。
テザリングも使うし、、、でアプリを作ることにした。

しかし、データ通信ON/OFFのAPIは非公開だった。

http://d.hatena.ne.jp/kuwalab/20110801/1312204484

を参考に作成。
なお、今の接続状態は、
ConnectivityManagerクラスのgetActiveNetworkInfo()メソッドを呼び出し、
NetworkInfoオブジェクトを取得してから、getTypeName ()を呼び出せば、
「WIFI」か「MOBILE」が返ってくる。

こんな感じ↓

      String status = "OFF";
   ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo netInfo = cm.getActiveNetworkInfo();
     if(netInfo != null){
          status = netInfo.getTypeName ();
     }


この場合も、AndroidManifest.xmlにパーミッションの設定が必要。
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2013年1月30日水曜日

Android テザリング設定アプリを作る

テザリング設定アプリを作ろうとしたが、APIは非公開。

2.3のドキュメントでの記述を見つけた↓
http://www.androidjavadoc.com/2.3/android/net/wifi/WifiManager.html

いつか消えてしまうかもしれないので(^^;;、転記。

isWifiApEnabled (テザリング状態取得)
public boolean isWifiApEnabled()
Return whether Wi-Fi AP is enabled or disabled.
Returns:
true if Wi-Fi AP is enabled

setWifiApEnabled(テザリングのON/OFF切り替え)
public boolean setWifiApEnabled(WifiConfiguration wifiConfig,
                                boolean enabled)
Start AccessPoint mode with the specified configuration. If the radio is already running in AP mode, update the new configuration Note that starting in access point mode disables station mode operation
Parameters:
wifiConfig - SSID, security and channel details as part of WifiConfiguration
Returns:
true if the operation succeeds, false otherwise

以下、Javaのリフレクションを使ったサンプル

(テザリング状態取得)
    private String getTetheringStatus(){
    String status = "UNSUPPORTED";
        try {
    Method method = wifiManager.getClass().getMethod("isWifiApEnabled");
    if("true".equals(method.invoke(wifiManager).toString())){
    status ="ON";
    }else{
    status ="OFF";
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
        return status;
    }


(テザリングのON/OFF切り替え)
    private void setTetheringEnabled(boolean toBeEnabled) { 
        Method method;
        try {
           method = wifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class, boolean.class);
           method.invoke(wifiManager, null,toBeEnabled);
        } catch (Exception e) {
         e.printStackTrace();
}
        if(toBeEnabled){
           tetheringButton.setEnabled(false);
           tetheringStatus.setText(ON);
        }else{            
           tetheringButton.setEnabled(true);    
           tetheringStatus.setText(OFF);
        }
   }

あと、AndroidManifest.xmlでパーミッションの設定も必要。

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>



参考URL





2013年1月29日火曜日

Windows8 mfc110u.dllがない?!

MFL-Pro Suiteの再インストール」の警告が出なくなったと思ったら、
今度は、「VUDesktopToast.exe - システムエラー」の表示(T T)


「コンピューターに mfc110u.dll がないため、プログラムを開始できません。

この問題を解決するには、プログラムを再ストールしてみてください。」


「mfc110u.dll」は、VisualC++のコンポーネント。「VUDesktopToast.exe」がこれを利用してるようだ。
ちなみに、「VUDesktopToast.exe」は、「SONYのVAIOのアプリケーションのアップデートを通知してくれるツール」らしい。

mfc110u.dll は、以下のサイトからダウンロードできる。
http://www.microsoft.com/ja-jp/download/details.aspx?id=30679

64ビット版の「vcredist_x64.exe」をインストールしたが、エラーは消えない(><)

もともとの原因が手順が間違っていたので、やり直しかと思ったが、
( 「VAIO Update for Windows 8 Upgrade」をインストールした後、Windows8にアップグレードしなくてはいけないかったのだ)

32ビット版の「vcredist_x86.exe」を入れると、エラーは出なくなった。

なんと、「VAIO Updateが32ビットの互換ソフトで動いているので、

64ビットOSの場合もx86をインストールしなくてはいけなかった」のだった..............

Windows8 MFL-Pro Suiteの再インストール必要?!

Windows8のアップグレード優待が1/末まで、ということで、
残り1週間を切りやっと重い腰をあげて、チャレンジ。

しか~し、これがなかなか一筋縄ではいかない。

Windows8起動時に「MFL-Pro Suiteの再インストールが必要」という警告のメッセージが出る。
MFL-Pro SuiteはBrotherの複合機MFC-J700Dのソフトらしい。
Brotherのサイトから一式ダウンロードして、インストールしようとすると、
既にドライバはインストール済み、とエラーが出て、先に進めない。

いったん「Brotherユーティリティ」を使って削除し、再インストールしたが、
メッセージは消えない。

ControlCenter3のアップデートツールをインストールしたら消えた、という情報があったので、
http://junkgadgetslive.blogspot.jp/2012/10/windows8-mfl-pro-suite.html

試したら、消えた。
しかし、フルパッケージにはControlCenter3の最新版が入っているはず、
その前にもいろいろ試したので、それが正解なのかよくわからない。。。

2013年1月17日木曜日

Androidアプリのショートカットの作り方

Androidアプリをインストールすると、ショートカットが自動で作成されたらいいな、
と、検索したら、

ショートカット用のクラスを作って登録する、というのを発見。
http://scarlet711.blogspot.jp/2011/06/blog-post_29.html

早速試してみた
Androidmanifest.xml(追記分)
 <activity android:name=".SetNetworkShortcut">
    <intent-filter>
        <action android:name="android.intent.action.CREATE_SHORTCUT"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>


SetNetwork.java
public class SetNetworkShortcut extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自動生成されたメソッド・スタブ
super.onCreate(savedInstanceState);

// ショートカットの内容 インテントを発行
        Intent shortcutIntent = new Intent(getApplicationContext(), SetNetworkActivity.class);

        // ホーム画面に設置した場合のショートカットの登録内容
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        Parcelable iconResource = Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.droidwifi);
        // ホーム画面に設置した場合に表示されるアイコンの設定
        intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
        // ホーム画面に設置した場合に表示されるラベル名の設定
        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));

        setResult(RESULT_OK, intent);
        finish();
}
}


しかし、これはアプリの起動方法によって複数ショートカットを持ちたい場合は有効だが、
インストール時にショートカットを自動生成してくれるものではなかった....orz

ショートカット自動生成はGooglePlayの機能だった、、、、。
設定のメニューの中にある(ただし現在はウィジェットの自動更新)
勝手に作ってくれるな、と言ってる人もいるし、やめておこう。

2013年1月16日水曜日

Android アプリがインストールできない?!

アプリケーション開発してテストしている時に、

名前が同じで、署名が合するパッケージが既にインストールされています
と表示され、インストールされなかった。

Androidアプリケーションは署名必須。
PackageManagerは、パッケージ名でアプリケーションを区別し、
同じパッケージ名のアプリケーションが既にインストールされているかどうかみる。
インストール済みの場合は、「署名に使われた証明書」が同じかどうかをチェックする。
違う場合はインストールされない。
これによって、アプリケーションの改竄を防いでいるのだ。

で、上記のエラーメッセージは、署名が違うからだめだ!というエラー。
しかし、初めてインストールしたアプリなのに(Why?)、
開発した別のアプリをインストールしているが、パッケージ名は違うはずだが、、、、。

と、AndroidManifest.xmlをよ~く見たら、
 「package=」で指定したものが一緒だった!!

ソースファイルのパッケージ指定は変えていたのだが、
プロジェクトをコピーして改造したから、AndroidManifest.xmlの「package=」がそのままだったから(^^;;

PackageManagerが見るのは、AndroidManifest.xmlの 「package=」指定だったよね(^^;;


もしGoogle Playからのインストールで、
名前が同じで、署名が合するパッケージが既にインストールされています
と出たら、要注意!
それでもインストールしたかったら、
インストール済みアプリをアンインストールして、再度チャレンジすれば入ります。

2013年1月11日金曜日

Android Widgetが、一覧に表示されない?!

ウィジェット開発のテストで、実機にインストールした。
が、

ウィジェット一覧に出てこない?!

という現象が何度か発生した。
そんなとき、端末を横に回転すると、あら不思議!ウィジェットが登場!!

ウィジェットのバグかと思ってたら、Androidくんが働いてなかっただけだったよう(^^;;

特定のデバイス(Androidバージョン4.0.4)で発生するので、
そのデバイスかバージョンの問題かと思い込んでいたが、そうでもないらしい。
詳しく解説してくれてるサイトを見つけました↓

http://www.webtech.co.jp/blog/android/2885/


「ウィジェット一覧に出てこない?!」と言われたら、

対策その1.端末を回転してもらう
対策その2.SDカードにインストールしている場合は本体にインストールしてもらう
対策その3.過去ウィジェットをインストールしたことがあるか、聞いてみる

その3(インストールしたら画面に現れる)と思ってる人もいるようで、
Google  Playでとても親切な説明を見かけるけど、必要なんですね....。

2013年1月10日木曜日

Android Widgetはデバッグできない?!

作成中のウィジェットの動作がおかしいのでデバッグしようとしたが、
eclipseでブレークポイントを設定して虫アイコンで起動しても止まらない。

調べるとサービスの場合は止まらないらしい。
日本Androidの会↓
https://groups.google.com/forum/?fromgroups=#!topic/android-group-japan/aRg_bpdPcPs

サービスのoncreateの中にandroid.os.Debug.waitForDebugger();と記述すると止まる

とあったので、Widgetで最初に呼び出されるonEnabled()メソッドの最初に記述してみた。
......確かに止まった。が、変数も式も(ウォッチしようとしても)何も表示されない。
再開、中断、ステップオーバー、ステップイン、、、アイコンはグレー表示で何もできない。

困った....。
そこでさらに調べたら、

http://tech.shantanugoel.com/2010/06/14/how-to-debug-android-widgets.html

日本語は↓
http://d.hatena.ne.jp/fxkireek/20111004/1317672620


DDMSパースペクティブのデバイスビュー(Devices)で、プロセスを指定して、虫アイコンをクリックする。
が、中断ボタンは現れたが、それ以外のボタンはダメ....orz

う~ん....困った。