電話をかける

Posted by muchag | Android |
初回投稿:2011-04-02 (土) 14:50:27 | 最終更新:2011-04-03 (日) 0:45:57

自作アプリから電話をかけるには
Dialer (電話)アプリと連携すれば楽チン。

Contacts (連絡先、住所録)との連携も可能。

コンポーネント間の連携なので Intent を用いる。
 

【環境】
android-sdk_r08-windows
Android DDMS 8.0.1.v201012062107-82219
Android 開発ツール 8.0.1.v201012062107-82219
Android Hierarchy Viewer 8.0.1.v201012062107-82219

間接ダイアル

間接ダイアルとは、2段階の手順を踏むパターン。

  1. ユーザが意思表示したとき(例えばボタンクリック)に、
    Dialer の画面が起動して指定電話番号が表示される
  2. ユーザが再び意思表示する(電話をかける)と初めてダイアルする

 

  1. package com.example;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.view.ViewGroup.LayoutParams;
  9. import android.widget.Button;
  10.  
  11. public class DialIndirect extends Activity implements View.OnClickListener {
  12.    
  13.     //ボタンオブジェクトの宣言
  14.     private Button myButton;
  15.  
  16.     @Override
  17.     public void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.  
  20.         //ボタンの生成
  21.         myButton = new Button(this);
  22.         //ボタンに表示するテキストの設定
  23.         myButton.setText("0123456789");
  24.         //ボタンクリック時のリスナーの登録
  25.         myButton.setOnClickListener(this);
  26.         //ボタンを画面へ配置
  27.         setContentView(myButton, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  28.     }
  29.  
  30.     //ボタンクリックイベントの処理
  31.     public void onClick(View view) {
  32.         if (view == myButton) {
  33.  
  34.             //電話番号文字列の生成
  35.             String myPhoneNumber = myButton.getText().toString();
  36.             //接続情報の設定
  37.             Uri uri = Uri.fromParts("tel", myPhoneNumber, null);
  38.             //暗黙のインテントの生成
  39.             Intent intent = new Intent(Intent.ACTION_DIAL, uri);
  40.            
  41.             //アクティビティの呼び出し
  42.             startActivity(intent);
  43.         }
  44.     }
  45. }

肝は39行目。

  1. //暗黙のインテントの生成
  2. Intent intent = new Intent(Intent.ACTION_DIAL, uri);

Android Developers:ACTION_DIAL
 
エミュレータ SS

 

電話番号の形式

ちなみに、23行目で電話番号を記号一切なし表記したが
ハイフンを入れても、カッコを入れてもちゃんと認識された。

  1. //ボタンに表示するテキストの設定
  2. myButton.setText("0123456789");

0123456789 → 0123-456-789
01-2345-6789 → 0123-456-789
01(2345)6789 → 0123-456-789

上記全てが同じ番号に認識された。
これならユーザのご入力の心配が大分軽減される。 😎
 

直接ダイアル

直接ダイアルとは、ユーザが意思表示したとき(例えばボタンクリック)に
即座にダイアルするパターン。

上記サンプルの39行目を以下のように変更。

  1. //暗黙のインテントの生成
  2. Intent intent = new Intent(Intent.ACTION_CALL, uri);

Android Developers:ACTION_CALL
 
そして、AndroidManifest.xml に1行追加。(17行目)

AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="com.muchag"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">
  7.         <activity android:name=".DialDirect"
  8.                   android:label="@string/app_name">
  9.             <intent-filter>
  10.                 <action android:name="android.intent.action.MAIN" />
  11.                 <category android:name="android.intent.category.LAUNCHER" />
  12.             </intent-filter>
  13.         </activity>
  14.  
  15.     </application>
  16.     <uses-sdk android:minSdkVersion="4" />
  17.     <uses-permission android:name="android.permission.CALL_PHONE" />  <!-- 追加 -->
  18.    
  19. </manifest>

これを勉強していて、直接よりワンクッションおいて
ユーザの意思確認をするべきだろうなぁ、と思いながら
パーミッション設定についてあれこれ見ていたら
とあるスパイウェア検出アプリのサイトに出くわした。
Tao software:tSpyChecker

アプリの説明ながら読んでいくとよい勉強になった。

そこで、このパーミッション設定のことが書いてあり
この直接ダイアルのための設定を行うと
アプリから自動で電話をかけることも可能だとのこと。

これはマズイよね・・・。
最初に思った通り、私は間接ダイアル方式を採択しよう・・・。

Posted by muchag | Android |
初回投稿:2011-04-02 (土) 14:50:27 | 最終更新:2011-04-03 (日) 0:45:57

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment