(六)8天快速掌握Android视频教程_电话拨号器

来源:互联网 发布:ubuntu14.04 阿里云源 编辑:程序博客网 时间:2024/04/30 09:05
关于attach source问题


点击attach source---选择external files然后选择所安装的安卓sdk的目录选择source然后选择你想要导入的对应版本的文件夹---确定后大功告成。




首先我们通过一个电话拨号器来实现安卓的拨号功能,它一共用到了三个显示控件,最上面一个TextView,下面是一个EditText,然后是一个Button只需要一个linearlayout
(线性布局),布局的类型选择的是垂直布局。


对于该界面中需要使用的文字放到values中的String.xml文件中。


对于电话的拨打我们应该如何实现呢,我们应该考虑到底是哪个Activity来提供这个电话拨号服务,这时候我们
就打开安卓系统源码的项目清单文件,因为在项目清单文件中它列出了软件的所具备的功能,打开它我们找到是哪个Activity来实现对外拨号功能的,只要我们能激活它并且把电话号码传给它,它就开始帮我们实现电话的拨打。当然它需要一个系统的拨打电话的权限(android:name:"android:permission CALL_PHONE")
我们现在要激活这个电话拨号器的Activity,让它帮我们拨打电话,只要我们能够提供的意图能够和这个Activity中的三个意图过滤器中的一个相匹配,就能激活这个Activity,从而实现电话的拨打。


所以我们打算提供一个意图对象,让它同该清单文件中电话拨号器中的的三个intent-filter中的一个相匹配,那么就可以调用该Activity,从而实现电话的拨打。


那么我们看看第这三个过滤器中的第一个:
<intent-filter>
<action android:name="android.intent.action.CALL"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="tel"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.CALL"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="voicemail"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.CALL"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.item/phone"/>
<data android:mimeType="vnd.android.cursor.item/phone_v2"/>
<data android:mimeType="vnd.android.cursor.item/person"/>
</intent-filter>


它一共有三个参数:第一个是动作名称,这个动作名称是由该Activity内部所定义的,第二个是类别,第三个是数据,在安卓的数据一般是采用Uri来描述的,它要求Uri+电话号码。意思就是它要求的数据以tel开头。为了能够激活这个电话拨号器帮我们拨打电话,我们就需要提供一些数据与该Activity中的三个intent-filter中的一个相匹配从而调用该Activity。




这时候我们new一个intent对象,我们希望这个意图能够拨号,这时候我们就需要这样设置:
intent.setAction("android.intent.action.CALL");
intent.setCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("tel:"+ number));
接下来我们就需要把这个意图传给操作系统,让操作系统区寻找Activity这种类型的组件。它就会用意图中的三个参数来匹配Activity中的意图过滤器中的参数,如果匹配的话就会调用该Activity,从而实现拨号功能。
最后我们调用startActivity(intent);方法来通过意图来调用Activity组件。该方法的在内部会自动为该intent添加;类型:刚好就是上面设置的类型。所以设置Category的那一行代码可以去掉了。只要我们把这个意图对象传给操作系统,系统就会调用号码拨号器的Activity。




最后应该添加一个拨打电话的权限,谷歌为了保护用户的隐私会在应用中赋予一些权限,那么用户在安装的时候会给出一些提示,用户可以通过这些提示来决定是否安装这个软件,但是在开发环境中,我们是以debug形式来进行部署软件的,所以不会有安全信息提示。当有安全和隐私的时候必须出示相应的权限。但是只有正常安装的时候才会给用户提供相应的提示。


我们的拨号功能是调用系统的拨号功能来实现的,但是如果系统中已经提供了拨号功能,那么我们为什么还需要这样写呢,这是因为我们在以后开发功能的时候会用到这样的技术,这时候里面已有电话了,而我们需要拨打电话,这时候里面如果有这样一个按键的会拨打电话会很方便。如果不集成这个功能的话用户就需要记下这个电话然后再去拨号,这样就不方便了。所以这项功能是有必要的。


查找ID是比较耗费性能的,所以我们应该把查找ID的代码放到外边点击事件外边去实行。所以把找ID这个方法放到onCreate方法中,把对变量的声明放到最外面,当做成员变量声明。


我们可以使用匿名内部类的方式来实现,但是不能说是new 接口,而是new 接口的类对象。但是不建议这样写,如果代码都的话会使得代码的可读性变差。




package com.adolph.phone;


import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class MainActivity extends Activity {


private TextView textView;
private EditText editText;
private Button button;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity);

textView = (TextView) findViewById(R.id.textView);
editText = (EditText) findViewById(R.id.editText);
button = (Button) findViewById(R.id.button);


button.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
String number = editText.getText().toString();
Intent intent = new Intent();
intent.setAction("android.intent.action.CALL");
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
}
});
}


}


还有同学会问,为什么不把那个类声明为一个新的类?这就涉及到了一个代码的优化题了,因为它要把字节文件加载到虚拟机当中,如果一个一个加载的话虚拟机会很耗费资源的。所以放在一起的话加载的话会比较快一点。所以在安卓里面大量的使用了内部类。


0 0