【网学网提醒】:网学会员编辑为广大网友搜集整理了: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(AdapterView>arg0,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(AdapterView>arg0){
//TODOAuto-generatedmethodstub
}
});
listView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
publicvoidonItemClick(AdapterView>arg0,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"
/>
拨号器
拨打此号码
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"
>
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"/>