当前位置: 网学 > 编程文档 > Android > 正文

android 电话拨号

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: myeducs.cn 发布时间: 13/03/17

【网学网提醒】:网学会员编辑为广大网友搜集整理了:android 电话拨号绩等信息,祝愿广大网友取得需要的信息,参考学习


    android2.2获取联系人,电话,并拨号
    主要功能有:读取联系人、号码,并lisetview显示,获取listview数据,并发短信、或者拨号
    packagecom.android.hello;
    importandroid.app.Activity;
    importandroid.content.Intent;
    importandroid.database.Cursor;
    importandroid.graphics.Color;
    importandroid.net.Uri;
    importandroid.os.Bundle;
    importandroid.telephony.PhoneNumberUtils;
    importandroid.util.Log;
    importandroid.view.View;
    importandroid.widget.AdapterView;
    importandroid.widget.LinearLayout;
    importandroid.widget.ListAdapter;
    importandroid.widget.ListView;
    importandroid.widget.RelativeLayout;
    importandroid.widget.TextView;
    importandroid.widget.Toast;
    importandroid.provider.ContactsContract;
    importjava.util.ArrayList;
    importjava.util.HashMap;
    importandroid.widget.SimpleAdapter;
    @SuppressWarnings("deprecation")
    publicclasshelloextendsActivity{
    /**Calledwhentheactivityisfirstcreated.*/
    //@SuppressWarnings("deprecation")
    //@Override
    //
    privatestaticfinalStringTAG="App";
    ListViewlistView;
    ListAdapteradapter;
    /**Calledwhentheactivityisfirstcreated.*/
    @Override
    publicvoidonCreate(BundlesavedInstanceState){
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);
    LinearLayoutlinearLayout=newLinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.setBackgroundColor(Color.BLACK);
    LinearLayout.LayoutParamsparam=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
    listView=newListView(this);
    listView.setBackgroundColor(Color.BLACK);
    linearLayout.addView(listView,param);
    this.setContentView(linearLayout);
    //生成动态数组,加入数据
    ArrayList>listItem=newArrayList>();
    ArrayList>listItemRead=newArrayList>();
    Cursorcursor=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
    while(cursor.moveToNext())
    {
    HashMapmap=newHashMap();
    StringphoneName=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    map.put("ItemTitle",phoneName);//电话
    StringcontactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    StringhasPhone=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
    if(hasPhonepareTo("1")==0)
    {
    Cursorphones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId,null,null);
    while(phones.moveToNext())
    {
    StringphoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.C
    ommonDataKinds.Phone.NUMBER));
    StringphoneTpye=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
    map.put("ItemText",phoneNumber);//多个号码如何处理
    Log.d(TAG,"testNum="+phoneNumber+"type:"+phoneTpye);
    }
    phones.close();
    }
    Cursoremails=getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId,null,null);
    while(emails.moveToNext())
    {
    StringemailAddress=emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
    StringemailType=emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
    Log.d(TAG,"testNum="+emailAddress+"type:"+emailType);
    }
    emails.close();
    listItem.add(map);
    }
    //生成适配器的Item和动态数组对应的元素
    SimpleAdapterlistItemAdapter=newSimpleAdapter(this,listItem,//数据源
    android.R.layout.simple_list_item_2,//ListItem的XML实现
    //动态数组与ImageItem对应的子项
    newString[]{"ItemTitle","ItemText"},
    //ImageItem的XML文件里面的一个ImageView,两个TextViewID
    newint[]{android.R.id.text1,android.R.id.text2}
    );
    listView.setAdapter(listItemAdapter);
    cursor.close();
    //listView.setEmptyView(findViewById(R.id.empty));
    listView.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){
    publicvoidonItemSelected(AdapterViewarg0,Viewarg1,
    intarg2,longarg3){
    //TODOAuto-generatedmethodstub
    //openToast("滚动到:"+arg0.getSelectedItemId());
    //短信发送
    setTitle("选择"+arg2+"项目");
    openToast("选择"+arg0.getSelectedItemId()+"项目");
    RelativeLayoutlr=(RelativeLayout)arg1;
    TextViewmText=(TextView)lr.getChildAt(1);
    openToast(mText.getText().toString());
    Stringnumber=mText.getText().toString();
    Log.d(TAG,"number="+number);
    //判断电话号码的有效性
    if(PhoneNumberUtils.isGlobalPhoneNumber(number)){
    Intentintent=newIntent(Intent.ACTION_SENDTO,Uri
    .parse("smsto://"+number));
    intent.putExtra("sms_body","TheSMStext");
    startActivity(intent);
    }
    }
    publicvoidonNothingSelected(AdapterViewarg0){
    //TODOAuto-generatedmethodstub
    }
    });
    listView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
    publicvoidonItemClick(AdapterViewarg0,Viewarg1,
    intposition,longarg3){
    //TODOAuto-generatedmethodstub
    //openToast("Click"+Integer.toString(position+1)+"项目");
    RelativeLayoutlr=(RelativeLayout)arg1;
    TextViewmText=(TextView)lr.getChildAt(1);
    openToast(mText.getText().toString());
    Stringnumber=mText.getText().toString();
    Log.d(TAG,"number="+number);
    //判断电话号码的有效性
    if(PhoneNumberUtils.isG
    lobalPhoneNumber(number)){
    Intentintent=newIntent(Intent.ACTION_DIAL,Uri
    .parse("tel://"+number));
    startActivity(intent);
    }
    }
    });
    }
    privatevoidopenToast(Stringstr){
    Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
    }
    }
    
    privatevoiddial(Stringnumber){
    Classc=TelephonyManager.class;
    MethodgetITelephonyMethod=null;
    try{
    getITelephonyMethod=c.getDeclaredMethod("getITelephony",
    (Class[])null);
    getITelephonyMethod.setAccessible(true);
    }catch(SecurityExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(NoSuchMethodExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }
    try{
    TelephonyManagertManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    ObjectiTelephony;
    iTelephony=(Object)getITelephonyMethod.invoke(tManager,(Object[])null);
    Methoddial=iTelephony.getClass().getDeclaredMethod("dial",String.class);
    dial.invoke(iTelephony,number);
    }catch(IllegalArgumentExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(IllegalAccessExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(SecurityExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(NoSuchMethodExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(InvocationTargetExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }
    }
    
    privatevoidcall(Stringnumber){
    Classc=TelephonyManager.class;
    MethodgetITelephonyMethod=null;
    try{
    getITelephonyMethod=c.getDeclaredMethod("getITelephony",
    (Class[])null);
    getITelephonyMethod.setAccessible(true);
    }catch(SecurityExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(NoSuchMethodExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }
    try{
    TelephonyManagertManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    ObjectiTelephony;
    iTelephony=(Object)getITelephonyMethod.invoke(tManager,(Object[])null);
    Methoddial=iTelephony.getClass().getDeclaredMethod("call",String.class);
    dial.invoke(iTelephony,number);
    }catch(IllegalArgumentExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace
    ();
    }catch(IllegalAccessExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(SecurityExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(NoSuchMethodExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }catch(InvocationTargetExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }
    }
    ************************************************************************************************
    Main.xml布局文件
    
    viewplaincopytoclipboardprint?
    
        android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/mobile"
    />
        android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button"
    android:id="@+id/button"
    />
    
    
    strings.xml文字引用文件
    
    viewplaincopytoclipboardprint?
    
    
    请输入手机号
    拨号器
    拨打此号码
    

    AndroidManifest.xml项目清单文件
    
    viewplaincopytoclipboardprint?
    
        package="com.zyq.phone"
    android:versionCode="1"
    android:versionName="1.0">
    
        android:label="@string/app_name">
    
    
    
    

    
    
    
    //电话拨打权限(必须)
    
    activity代码
    
    viewplaincopytoclipboardprint?
    packagecom.zyq.phone;
    importandroid.app.Activity;
    importandroid.content.Intent;
    importandroid.net.Uri;
    importandroid.os.Bundle;
    importandroid.view.View;
    importandro
    id.widget.Button;
    importandroid.widget.EditText;
    publicclassPhoneActivityextendsActivity
    {
    privateEditTextmobileText;
    /*
    *做一个简单的电话拨号器功能
    *在OnCreate方法只会执行一次所以特别适合做数据的初始化工作
    *特别耗时的工作最好不要放在这个方法里使用默认5秒无反应会抛出ANR异常
    */
    
    @Override
    publicvoidonCreate(BundlesavedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    Buttonbutton=(Button)this.findViewById(R.id.button);
    mobileText=(EditText)findViewById(R.id.mobile);
    
    button.setOnClickListener(newView.OnClickListener()
    {
    
    publicvoidonClick(Viewv)
    {
    /*在源码里找到的激活系统自带拨打的activity拨打功能
    *利用Intent激活即可必须以tel开始
    *Uri形式的
    *
    *
    *
    *
    *

    **/
    Stringmobile=mobileText.getText().toString();
    Intentintent=newIntent();
    intent.setAction("android.intent.action.CALL");
    intent.setData(Uri.parse("tel:"+mobile));
    startActivity(intent);//该方法会把android.intent.category.DEFAULT设给Intent
    }
    });
    }
    }
    **************************************************************************************
    Android源码分析-打电话和发短信
    1.ITelephony接口和ISms接口以及AIDL
    在我们的Android应用中,当需要实现电话拨号时,我们需要进行如下调用
    ITelephonyphone=(ITelephony)ITelephony.Stub.asInterface(ServiceManager.getService("phon"))
    phone.dial("10086");
    对于短信应用,我们需要的是调用SmsManager,代码如下
    SmsManagermanager=SmsManager.getDefault();
    manager.sendTextMessage("10086",null,"hi,thisissms",null,null);
    这里,SmsManager对ISms做了一层包装,实质上是通过调用
    ISmssimISms=ISms.Stub.asInterface(ServiceManager.getService("isms"));
    simISms.sendRawPdu....
    
    可以看到,应用都是采用AIDL来实现IPC的跨进程调度。
    对于AIDL应用,调用进程方存在的是一个实现接口的Proxy对象,通过Proxy对象与被调用进程中的Stub对象进行
    通讯来实现IPC的跨进程调度,所以,在被调用进程一端必定有一个ITelephony.Stub类以及ISms.Stub类的实现。
    2.PhoneInterfac
    eManager和SimSmsInterfaceManager
    ITelephony.Stub的实现类为com.android.phone.PhoneInterfaceManager
    ISms.Stub的实现类为com.android.internal.telephony.gsm.SimSmsInterfaceManager
    从这两个类的构造器的调用代码里可以很清楚的看到进行了Service的注册工作
    ServiceManager.addService("phone",this);
    ServiceManager.addService("isms",this);
    3.PhoneApp,InCallScreen,PhoneUtils及其他相关类
    从SimSmsInteferManager的相关方法实现中可以看到,具体就是调用GSMPhone的SmsDispatcher实例来进行相关操作的。
    从PhoneInterfaceManager会维持一个Phone对象的引用,当拨号应用时,PhoneInterfaceManager会将构造好的Intent传递
    给PhoneApp应用,该Intent的className指定则为InCallScreen,从中我们可以看到InCallScreen具体是通过PhoneUtils调用Phone的
    相关方法来实现。
    PhoneInterfaceManager怎么获取到对应的Phone对象,然后又怎么将Phone对象传递到InCallScreen中呢?
    具体这里涉及到了PhoneApp这个类,从这个类维护了一个PhoneInterfaceManager的引用(phoneMgr)以及一个Phone引用(phone),
    从该类的onCreate方法中我们可以清楚的看到,PhoneApp通过PhoneFactory获取了一个Phone实例,并通过该实例实现了PhoneInterfaceManager对象。
    因此,我们现在只需要关注PhoneFactory具体提供的是一个什么样的Phone实例了。
    另外,PhoneApp类还提供了一个静态方法getInstance供InCallScreen调用,InCallScreen正是通过调用该方法获得PhoneApp实例从而
    获得对应的Phone实例的。
    接下来,我们通过查看PhoneFactory的方法可以看到,Phone对象对应的就是一个GSMPhone实例。
    4。GSMPhone与RIL
    从GSM的构造器可以看出,他依赖一个CommandInterface接口实例,通过PhoneFactory的makeDefaultPhones方法,我们可以看到,根据系统环境变量
    ro.radio.noril来判断是否需要采用RIL框架实现,如果该参数不为空,则采用Simultedcommands(主要是为了测试需要提供的模拟实现).否则,采用RIL。
    通过Google才知道,RIL其实是智能手机上实现AP与BP之间通信的一种设计思想,具体大家可以参见这篇文章eetchina/ARTICLES/2006OCT/PDF/CPCOL_2006OCT26_EMB_TA_170.PDF?SOURCES=DOWNLOAD
    在RIL.java中我们很惊喜的看到,RIL对对消息的处理是将消息通过LocalSocket发送到以rild为名称的有名端口。这个有名Socket的创建在ril.cpp代码中。
    s_fdListen=android_get_control_socket(SOCKET_NAME_RIL)
    原来Android通话和发短信的应用是JAVA与C++代码之间透过Socket连接来传输消息来实现的。
    5.关于C代码与硬件之间的交互
    这部分工作其实就是C代码通过串口发送AT指令来拨号,收发短信。今天有点累了,具体的实现下次我再分析。
    ****
    *****************************************************************************
    传智播客java培训:Android之环境搭建与电话拨号器(2010-07-2307:51:41)转载
    标签:杂谈 分类:学习日记与笔记
    今天我们开始学习Android手机的开发,在这个课程开始之前,黎活明老师向我们介绍了Android的行业背景,行业薪资以及发展前景,听到大家都热血沸腾。都有一种毕业之后投入到Android手机开发的行业中的冲动。然后就是正式的3G手机开发了。七天的学习之路开始了。
    3G,全称是3rdGeneration中文含义是第三代数字通信技术。这是一种将无线通信技术与国际互联网技术结合起来的新一代通信技术。3G只是一种技术标准,符合这种技术标准的主要有WCDMA,CDMA2000,TD-SCDMA三种制式,中国联通使用的是WCDMA技术,大部分3G网络使用的都是这种技术标准。中国移动使用的是拥有自主知识产权的TD-SCDMA技术,这个技术只有在中国才使用,中国电信使用的是CDMA2000,这个技术是韩国和北美使用的技术标准。与以前的手机制式相比,新的3G网络能够处理图像、音乐、视频等多种多媒体形式,包括网页浏览、电话会议、电子商务等多种信息服务。同时它最大的提升是在声音传输和数据的速度上。
    现今在市面上使用的手机软件平台有很多种,我们学习的Android是3G应用的一种主要的手机操作系统。Android是Google公司于2007年11月5日宣布的基于Linux平台的开源手机操作系统,它包括一个操作系统,中间件和一些重要的应用程序。它采用软件堆层(SoftwareStack,又名软件叠层)的架构,主要分为三部分。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和Dalvik虚拟机,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。因为不存在任何以往阻碍移动产业创新的专有权的障碍,因此Android可以看做是一个类似windows的操作系统,只不过这个系统是运行在手机上的。在国内Android手机开发的前景十分广阔,许多大公司都在加入Android阵营,包括中国移动,中国联通,华为通讯,联想等。
    Android开发之插件
    所需的开发的环境:JDK1.5或者是JDK1.6版,Eclipse3.5。这个是最低的版本要求,如果有JRE1.5版或者是JRE1.6是不够的。如果是有Eclipse了,在开发过程中还要下载Android应用的ADT插件,在Eclipse中,选择Help-->installNewSoftware,出现对话框,选择Add按钮,在对话框中name栏中输入ADT点击Archive...。就可以下载ADT插件的压缩文件了,然后按照步骤,一步一步的安装就可以了。在安装完ADT后,就要安装AndroidSDK了,这个是And
    roid应用所依赖的插件包。里面有相关的运行环境和相应的工具等。这个SDK下载完成后解压,启动Eclipse,选择window--->prefferences,打开视图后点击Android,在里面选择SDK所在的位置就可以了。
    Android项目的程序架构
    src/java原代码存放目录
    gen/自动生成目录,这个目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的xml界面文件、图标与常量,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
    res/资源(Resource)目录,在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。
    assets资源目录,Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp
    AndroidManifest.xml项目清单文件,这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
    default.properties项目环境信息,一般是不需要修改此文件
    Android之电话拨号器
    点换拨号器是使用手机的比较简单的应用功能,这个功能的实现是这样的,首先并不是我们自己写了一个电话拨号功能的程序文件,而是我们编写一个界面,然后写程序在后台调用手机中内置的电话拨号的功能,实现的电话拨打的功能。
    程序开发的步骤:
    <1>如果要实现这个功能的开发的话,首先要配置一个权限,这个权限是在AndroidManifest.xml中进行配置的。这个配置文件是Android手机中的配置文件,无论我们要实现何种功能,首先都要进行权限的配置,否则是没有能力进行程序的运行的。
    <2>写出程序的主界面,在这里黎活明老师向我们讲解了Android应用界面开发的简单知识,界面中的布局格式等。这个是我们进行手机开发中必须具备的能力,因为现在国内的Android程序员数量非常的少,所以进行Android开发不可能象JavaWeb开发那样分的工作那样的细致,很多时候一个程序员要包
    办很多的工作。
    <3>前面的工作完成之后吗,就可以进行主程序的开发啦,在刚刚还没有对Android程序有概念的的时候,一个Android程序就写完了。感觉这个和JavaWeb的程序很相似,想想也是,其实就是一个Java的程序,没有什么神秘的。
    在电话拨号器后。我们又学习了一个短信息发送器的程序。这个就不多说了。
    /////////////////////////////////////////////////////////////////////////////////////
    android实例1---电话拨号器android2010-06-0311:12:57阅读136评论0字号:大中小订阅
    1.创建如上面的界面:代码放在layout/phone.xml文件中。
    
        android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="schemas.android/apk/res/android"
    >
        android:id="@+id/widget28"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_x="0px"
    android:layout_y="3px"
    >
    
        android:id="@+id/inputmobile"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="输入号码:"
    >
    
    

    
        android:id="@+id/moblie"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    >
    
    

    
        android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="拨打此号码"
    >
    
    

    
    
    2.AndroidManifest.xml文件中写成如下:
    
        package="com.test"
    android:versionCode="1"
    android:versionName="1.0">
    
        android:label="@string/app_name">
    
    
    
    

    
    
    
    
    
    
    
    
    
    3.创建activity
    publicclassMobileextendsActivity
    {
    @Override
    publicvoidonCreate(BundlesavedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.phone);
    //获得对象
    Buttonbutton=(Button)findViewById(R.id.button);
    button.setOnClickListener(newView.OnClickListener()
    {
    publicvoidonClick(Viewv)
    {
    EditTexteditText=(EditText)findViewById(R.id.moblie);
    //跳转特别注意在Uri.parse中一定要加"tel:",如果不加就会报异常
    Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"
    +editText.getText()));
    Mobile.this.startActivity(intent);
    }
    });
    }
    
    }
    
    4.测试:
    先运行此activity.
    再在DOS中转换到SDK中的tools目录下如(D:\android-sdk-windows-1.5_r2\tools>),最后输入emulator-dataitcast
    注:最后一个参数是自己随便设置的,它是一个文件,如果有这个文件就不创建,如果没有就创建一个。
    下面是DOS中输入命令后出来的界面:
    下面是eclipse中运行出来的界面:
    DOS中最上面的那个标识5556就是号码。
    ///////////////////////////////////////////////////////////////////////////////////
    【Android】可输入电话号码的拨号程序
    收藏分享2010-11-414:06|发布者:|查看数:266|评论数:0
    下面我们进一步完善第一阶段中的成果,使得用户能输入电话号码。由于用户输入的内容可
    能不是一个有效的电话号码,所以程序还需要对用户输入的字符串进行判断,呼叫有效号码,如
    果是无效号码则提示用户重新输入。
    步骤1:修改用户界面,加入获取用户输入的EditText控件。
    在Button控件之上加入一个EditText控件用于获取用户输入电话号码,设置其id引用名为
    phonenumber_id。
        android:id="@+id/phonenumber_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>
        android:id="@+id/button_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/button"/>
    步骤2:获得EditText对象的引用。
    finalEditTextphoneNumber=
    (EditText)findViewById(R.id.phonenumber_id);
    步骤3:在回调方法onClick中加入对电话号码有效性的判断和处理。
    @Override
    publicvoidonClick(Viewb){
    Stringcallee=phoneNumber.getText().toString();
    if(PhoneNumberUtils.isGlobalPhoneNumber(callee)){
    Intenti=newIntent(Intent.ACTION_DIAL,
    Uri.parse(tel"://"+callee));
    startActivity(i);
    }else{
    Toast.makeText(TinyDialer.this,R.string.notify_incorrect_phonenumber,
    Toast.LENGTH_LONG).show();
    }
    }
    步骤3中有几点需要说明。
    (1)判断
    电话号码的有效性可以使用android.telephony.PhoneNumberUtils包中的
    isGlobalPhoneNumber方法,Android已经为我们准备了很多诸如此类的基本方法简化程序员的
    工作量,用好这些方法能够帮助我们轻松快速地完成工作。
    (2)对于无效电话号码的提示,我们可以使用Toast类。SDK文档中明确说明Toast是包含给用
    户快速提醒信息的一种通知机制。当然,你可能会问,我怎么知道AndroidSDK提供了哪些机制帮
    助我实现不同的需求?一个好办法是查看模拟器中自带的APIDemos(API演示),如图5-4所示。
    APIDemos已经分门别类地为读开发人员组织了很多实例,这些丰富多彩的实例是开发人员1
    获取灵感的好地方。比如我们这里用到的Toast就在App->Notification->NotifyWithText这个例子
    中,如图5-5所示。
    图5-4模拟器自带了APIDemos
    图5-5NotifyWithText示例的界面
    相应的源代码可以在AndroidSDK安装目录下的\samples\ApiDemos\src\com\example\
    android\apis\app\NotifyWithText.java中找到。有了这样一个有力的帮手,相信你开发应
    用程序时会更有信心。至此我们就完成了所有主要功能,完成后的程序外观如图5-6所示。
    如果用户输入的内容不是一个有效电话号码,那么可以看到类似这样的提示,如图5-7所示。
    图5-6完成后的TingDialer应用程序
    图5-7输入号码不正确会看到提示
    
    ///////////////////////////////////////////////////////////////////////////////////
    android手机端电话拨号器和短信发送器代码级测试内容默认分类2010-12-3116:05:25阅读18评论1字号:大中小订阅
    电话拨号器
    
    因为应用要使用手机的电话服务,所以要在清单文件AndroidManifest.xml中添加电话服务权限:
    
        package="cn.itcast.action"
    android:versionCode="1"
    android:versionName="1.0">
    略....
    
    
    
    
    
    界面布局:
    
        android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        android:layout_width="fill_parent"android:layout_height="wrap_content"
    android:text="@string/inputmobile"/>
    
        android:id="@+id/mobile"/>
    
        android:text="@string/button"
    androi
    d:id="@+id/button"/>
    
    LinearLayout(线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局)
    
    
    Activity:
    publicclassDialerActionextendsActivity{
    @Override
    publicvoidonCreate(BundlesavedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Buttonbutton=(Button)findViewById(R.id.button);
    button.setOnClickListener(newView.OnClickListener(){
    publicvoidonClick(Viewv){
    EditTexteditText=(EditText)findViewById(R.id.mobile);
    Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+editText.getText()));
    DialerAction.this.startActivity(intent);
    }
    });
    }
    }
    
    
    测试步骤:
    1>在Eclipse中运行此应用
    2>在Dos窗口中进入androidSDK安装路径的tools目录,输入以下命令再开启一个Android模拟器:
    emulator-dataitcast
    注:itcast为用户数据存取文件,如果该文件不存在,默认在tools目录创建该文件
    3>在电话扰号器中输入上图现显的电话号码
    
    短信发送器
    
    
    因为应用要使用手机的短信服务,所以要在清单文件AndroidManifest.xml中添加短信服务权限:
    
        package="cn.itcast.sms"
    android:versionCode="1"
    android:versionName="1.0">
    略....
    
    
    
    
    
    界面布局:
    
        android:orientation="vertical“android:layout_width="fill_parent“android:layout_height="fill_parent">
        android:text="@string/inputmobile"/>
    
        android:id="@+id/mobile"/>
        android:text="@string/content"/>
    
        android:minLines="3"
    android:id="@+id/content"/>
    
        android:text="@string/button"
    android:id="@+id/button"/>
    
    
    
    Activity主要代码:
    Stringmobile=mobileView.getText().toString();
    Stringcontent=contentView.getText().toString();
    SmsManagersmsManager=SmsManager.getDefault();
    PendingIntentsentIntent=PendingIntent.getBroadcast(SMSSender.this,0,newIntent(),0);
    if(content.length()>70){//如果字数超过70,需拆分成多条
    短信发送
    Listmsgs=smsManager.divideMessage(content);
    for(Stringmsg:msgs){
    smsManager.sendTextMessage(mobile,null,msg,sentIntent,null);
    //最后二个参数为短信已发送的广播意图,最后一个参数为短信对方已收到短信的广播意图
    }
    }else{
    smsManager.sendTextMessage(mobile,null,content,sentIntent,null);
    }
    Toast.makeText(SMSSender.this,"短信发送完成",Toast.LENGTH_LONG).show();
    
    
    测试步骤:
    1>在Eclipse中运行此应用
    2>在Dos窗口中进入androidSDK安装路径的tools目录,输入以下命令再开启一个Android模拟器:
    emulator-dataitcast
    注:itcast为用户数据存取文件,如果该文件不存在,默认在tools目录创建该文件
    3>在短信发送器的手机号中输入上图现显的电话号码
    注:目前Android系统对中文短信尚未支持,所以发送中文短信会有乱码,这个问题日后会被解决的。
    /////////////////////////////////////////////////////////////////////////////////
    1、Android应用程序开发模式
    随着Android的发展,Android程序员会有2种分工,一种UI设计(美工)一种后台程序设计】,采用b/s架构
    a、一般小应用设计模式:
    先设计界面-->设计Activity-->业务层代码
    b、做项目:
    业务层代码(AndroidJunit)-->设计界面-->设计Activity(MVC)
    2、拨号器&;短信发送器小例程
    本章有2个小例程,用于学习,采用“先设计界面-->设计Activity-->业务层代码”
    用处:
    CRM客户关系管理系统–>手机–>客户关系
    电话拨打
    【拨打】
    拨号器小应用:
    界面部分:
    main.xml
    
        android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
          android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/mobile"
     />
    
        android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:id="@+id/mobile"
     />
    
          android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/button"
     android:id="@+id/button"
     />
    
    
    
    strings.xml
    
    
    HelloWorld,PhoneActivity!

    我的拨号器
    请输入手机号
    拨打此号码
    
    androidmanifest.xml
    
        package="com.leo"
    android:versionCode="1"
    android:versionName="1.0">
    
    
    
    
        android:label="@string/app_name">
    
    
    
    

    
    
    
    activity部分:
    phoneactivity.jvaa
    packagecom.leo;
    importandroid.app.Activity;
    importandroid.content.Intent;
    importandroid.net.Uri;
    importandroid.os.Bundle;
    importandroid.view.View;
    importandroid.widget.Button;
    importandroid.widget.EditText;
    publicclassPhoneActivityextendsActivity{
    privateEditTextmobileText;
    
    @Override
    publicvoidonCreate(BundlesavedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mobileText=(EditText)this.findViewById(R.id.mobile);
    Buttonbutton=(Button)this.findViewById(R.id.button);
    button.setOnClickListener(newView.OnClickListener(){
    
     publicvoidonClick(Viewv){
     Stringmobile=mobileText.getText().toString();
     Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+mobile));//action,data
     PhoneActivity.this.startActivity(intent);
     }
     });
    
    }
    }
    ////////////////////////////////////////////////////////////////////////////
    一个简单的拨号器附源码
    文章分类:移动开发
    开发一个简单的拨号器。
    开发一个应用的步骤:
    小应用的步骤:
    1.设计界面
    2.activity
    3.设计业务层如果程序比较简单就将代码直接写在activity中
    大应用的步骤
    1.设计业务层。用androidjunit测试完成
    2.设计界面
    3.设计activtiy
    我们按照一个简单的应用来开发;
    1.设计界面
    三个元素,标题,文本输入框,按钮
    main.xml这里面的标签前面的文章都介绍过,这里就不再介绍了;
    Java代码
    
        android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    
    >
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    
  ,   />
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/phoneNumber"
    />
        android:layout_width="wrap_content"
    android:layout
    _height="wrap_content"
    android:text="@string/buttonText"
    android:id="@+id/button"
    />
    
    
        android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    
    >
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    
    />
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/phoneNumber"
    />
        android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttonText"
    android:id="@+id/button"
    />
    
    String.xml
    Java代码
    
    
    请输入手机号码
    完美拨号器
    拨打这个号码
    

    
    
    请输入手机号码
    完美拨号器
    拨打这个号码
    

    R.java
    Java代码
    /*AUTO-GENERATEDFILE.DONOTMODIFY.
    *
    *Thisclasswasautomaticallygeneratedbythe
    *aapttoolfromtheresourcedataitfound.It
    *shouldnotbemodifiedbyhand.
    */
    
    packagecn.perfect.call;
    
    publicfinalclassR{
    publicstaticfinalclassattr{
    }
    publicstaticfinalclassdrawable{
    publicstaticfinalinticon=0x7f020000;
    }
    publicstaticfinalclassid{
    publicstaticfinalintbutton=0x7f050001;
    publicstaticfinalintphoneNumber=0x7f050000;
    }
    publicstaticfinalclasslayout{
    publicstaticfinalintmain=0x7f030000;
    }
    publicstaticfinalclassstring{
    publicstaticfinalintapp_name=0x7f040001;
    publicstaticfinalintbuttonText=0x7f040002;
    publicstaticfinalinthello=0x7f040000;
    }
    }
    /*AUTO-GENERATEDFILE.DONOTMODIFY.
    *
    *Thisclasswasautomaticallygeneratedbythe
    *aapttoolfromtheresourcedataitfound.It
    *shouldnotbemodifiedbyhand.
    */
    packagecn.perfect.call;
    publicfinalclassR{
    publicstaticfinalclassattr{
    }
    publicstaticfinalclassdrawable{
    publicstaticfinalinticon=0x7f020000;
    }
    publicstaticfinalclassid{
    publicstaticfinalintbutton=0x7f050001;
    publicstaticfinalintphoneNumber=0x7f050000;
    }
    publicstaticfinalclasslayout{
    publicstaticfinalintmain=0x7f030000;
    }
    publicstaticfinalclassstring{
    
    publicstaticfinalintapp_name=0x7f040001;
    publicstaticfinalintbuttonText=0x7f040002;
    publicstaticfinalinthello=0x7f040000;
    }
    }
    2.设计activtiy
    Java代码
    packagecn.perfect.call;
    
    importandroid.app.Activity;
    importandroid.content.Intent;
    importandroid.net.Uri;
    importandroid.os.Bundle;
    importandroid.view.View;
    importandroid.view.View.OnClickListener;
    importandroid.widget.Button;
    importandroid.widget.EditText;
    
    publicclassPhoneActivityextendsActivity{
    /**
    *将从控件中得到值声明成全局变量,这样每次都只查询一次就行
    *第二次就直接从这个全局变量中拿就可以了这样提高效率
    */
    privateEditTextphoneEditText;
    privateButtoncallButton;
    /**Calledwhentheactivityisfirstcreated.*/
    @Override
    publicvoidonCreate(BundlesavedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //得到文本框的内容
    phoneEditText=(EditText)this.findViewById(R.id.phoneNumber);
    callButton=(Button)this.findViewById(R.id.button);
    /**
    *给按钮添加一个点击事件onclicklistenter的参数是OnClickListener是一个接口
    *我们要这个接口的一个实现类,要得到这个接口的实现类的方法有两种,一个是创建一个类
    *实现这个接口,第二种方法就是匿名内部类
    */
    callButton.setOnClickListener(newOnClickListener()
    {
    
    publicvoidonClick(Viewv){
    //TODOAuto-generatedmethodstub
    StringnumberString=phoneEditText.getText().toString();
    /**
    *接下来的操作就是将这个电话号码播出去
    *要调用android的方法来实现,为了保证安全,在使用电话拨号服务的时候要声明电话
    *拨号权限,这个权限的功能是在安装这个应用的时候,如果你涉及到了拨号服务,就会
    *提示用户:“这个应用使用了电话拨号服务你是否还要安装”
    *添加这个拨号权限是在功能文件AndroidManifest.xml中添加,
    *那么android还有什么权限设置呢在这个文件中查看
    *android-sdk-windows\docs\reference\android\Manifest.permission.html
    *发短信接受短信刻录语音都要加权限
    */
    
    //现在添加了拨号权限然后我们开始拨号拨号要创建一个名为意图的对象
    /**
    *Intent(动作,数据)两个参数
    
    *Intent就是将动作和参数交给android然后让他判断这个动作应该使用什么来执行
    *"tel:"+numberString这个参数的格式是android规定的;
    */
    Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+numberString));
    /**
    *意图对象生成后要传递给操作系统执行这个意图
    *内部类访问外部类的实例的方法
    */
    PhoneActivity.this.startActivity(intent);
    }
    
    });
    
    }
    }
    packagecn.perfect.call;
    importandroid.app.Activity;
    importandroid.content.Intent;
    importandroid.net.Uri;
    importandroid.os.Bundle;
    importandroid.view.View;
    importandroid.view.View.OnClickListener;
    importandroid.widget.Button;
    importandroid.widget.EditText;
    publicclassPhoneActivityextendsActivity{
     /**
     *将从控件中得到值声明成全局变量,这样每次都只查询一次就行
     *第二次就直接从这个全局变量中拿就可以了这样提高效率
     */
     privateEditTextphoneEditText;
     privateButtoncallButton;
    /**Calledwhentheactivityisfirstcreated.*/
    @Override
    publicvoidonCreate(BundlesavedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //得到文本框的内容
    phoneEditText=(EditText)this.findViewById(R.id.phoneNumber);
    callButton=(Button)this.findViewById(R.id.button);
    /**
    *给按钮添加一个点击事件onclicklistenter的参数是OnClickListener是一个接口
    *我们要这个接口的一个实现类,要得到这个接口的实现类的方法有两种,一个是创建一个类
    *实现这个接口,第二种方法就是匿名内部类
    */
    callButton.setOnClickListener(newOnClickListener()
    {
     publicvoidonClick(Viewv){
     //TODOAuto-generatedmethodstub
     StringnumberString=phoneEditText.getText().toString();
     /**
     *接下来的操作就是将这个电话号码播出去
     *要调用android的方法来实现,为了保证安全,在使用电话拨号服务的时候要声明电话
     *拨号权限,这个权限的功能是在安装这个应用的时候,如果你涉及到了拨号服务,就会
     *提示用户:“这个应用使用了电话拨号服务你是否还要安装”
     *添加这个拨号权限是在功能文件AndroidManifest.xml中添加,
     *那么android还有什么权限设置呢在这个文件中查看
     *android-sdk-windows\docs\reference\android\Manifest.permission.html
     *发短信接受短信刻录语音都要加权限
     */
    
     //现在添加了拨号权限然后我们开始拨号拨号
    要创建一个名为意图的对象
     /**
     *Intent(动作,数据)两个参数
     *Intent就是将动作和参数交给android然后让他判断这个动作应该使用什么来执行
     *"tel:"+numberString这个参数的格式是android规定的;
     */
     Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+numberString));
     /**
     *意图对象生成后要传递给操作系统执行这个意图
     *内部类访问外部类的实例的方法
     */
     PhoneActivity.this.startActivity(intent);
     }
    
    });
    
    }
    }
    AndroidManifest.xml
    Java代码
    
        package="cn.perfect.call"
    android:versionCode="1"
    android:versionName="1.0">
    
        android:label="@string/app_name">
    
    
    
    

    
    
    
    
    
    
    
        package="cn.perfect.call"
    android:versionCode="1"
    android:versionName="1.0">
    
        android:label="@string/app_name">
    
    
    
    

    
    
    
    
    
    3.由于我们将业务写在了activity里所以没有写业务层
    4.运行项目
    [img]
    dl.javaeye/upload/picture/pic/55839/8d16bc79-6ecb-329b-b859-9f42897b6c00.bmp
    [/img]
    这是在电脑上运行的程序所以不能拨打现实生活中的电话号码,我们要验证项目是否可以拨打号码,那就再开一个模拟终端;然后那个端口号码就是这个模拟终端的电话号码,那么我们来用这个程序拨打5556这个电话,结果打通了。程序验证成功;
    
  • 上一篇资讯: android 的一些属性
  • 下一篇资讯: Android 环境搭配
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号