您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
08_案例1 android下的电话拨号器
发布时间:2021-01-30 19:39:03编辑:雪饮阅读()
首先建立一个空项目
<string name="app_name">My Application</string>
<string name="please_input_number">请输入拨打号码</string>
<string name="hint">请输入号码</string>
</resources>
就以带有hint属性的这个可编辑元素为例,这里我们将id设置为et_number
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/hint"
android:id="@+id/et_number"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt1"
/>
同样的,按钮也给它定义一个id
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt1"
android:id="@+id/bt_dail"
/>测试界面效果
布局差不多都完成了,接下来我们要看看效果,那么我们需要建立一个对应api(安卓9)的虚拟机进行测试,你可能会遇到这个问题,我本来以为我要点击右上角安装。。。结果稍微耐心点击,创建界面还是会出来的。。。只是加载的比较慢,也或者后台下载安装了,只是界面还没有同步渲染过来
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/hint"
android:id="@+id/et_number"
android:numeric="integer"
android:lines="1"
/>
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
//一般tag和当前类名定义相同
public static final String tag="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取button按钮
//this相当于R.layout.activity_main,所以元素查找也相当于是在R.layout.activity_main中查找
//this不一定就是R.layout.activity_main,主要看setContentView设置的是谁了
Button button=(Button) this.findViewById(R.id.bt_dail);
/* 给按钮设置监听事件 */
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("按钮被点击了");
//日志打印就用到了上面定义的tag标签
Log.i(tag,"button 被点击了");
}
});
/*在eclipse中是这样实现的,换到android studio中竟然监听就只能在new 一个内部类。。。
* button.setOnClickListener(this)
* */
}
/*
这也是原来eclipse中实现接口的方法,直接在主类下面建立内部类,而不是现在Android studio这种直接监听事件new一个匿名内部类,不过就当前场景来说,new一个匿名内部类的方式显然更精简些
private class MyButtonClickListener implements View.OnClickListener {
//在某一个view对象,被点击的时候调用的回调方法
@Override
public void onClick(View view) {
System.out.println("按钮被点击了");
Log.i(tag,"button 被点击了");
}
}
*
* */
}接下来我们在虚拟机中运行最新的项目并点击按钮产生日志,然后将日志设置仅显示tag,就可以看到我们click事件产生的日志了
日志级别
日志有5个级别(常用方法),i、e、d、v、w
Log.i(tag,"button 被点击了-i");
Log.e(tag,"button 被点击了-e");
Log.d(tag,"button 被点击了-d");
Log.v(tag,"button 被点击了-v");
Log.w(tag,"button 被点击了-w");并且这些日志级别可以通过在日志猫中下拉筛选只看某一级别的日志,但并非精确到某个级别日志,会有上下级包含的情况的日志出现。
这里只查看了info类型的日志,但是还是有其它类型的日志
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
public static final String tag="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button) this.findViewById(R.id.bt_dail);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String time = formatter.format(curDate);
System.out.println("按钮被点击了");
Log.i(tag,"button 被点击了-i+"+time);
Log.e(tag,"button 被点击了-e+"+time);
Log.d(tag,"button 被点击了-d+"+time);
Log.v(tag,"button 被点击了-v+"+time);
Log.w(tag,"button 被点击了-w+"+time);
}
});
}
}关于日志级别的详细说明:
android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。
1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");
2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.
3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。
打电话的实现
打电话的实现如:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
public static final String tag="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button) this.findViewById(R.id.bt_dail);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String time = formatter.format(curDate);
//获取文本编辑输入框
EditText mEditText=(EditText) MainActivity.this.findViewById(R.id.et_number);
//获取文本编辑输入框中的输入文本
String number=mEditText.getText().toString();
Log.i(tag,number);
//创建一个意图
Intent intent=new Intent();
//给创建的这个意图设置一个动作 设置为打电话的动作
intent.setAction(intent.ACTION_CALL);
//给意图的动作传递参数 打电话动作需要一个Uri的数据
intent.setData(Uri.parse("tel:"+number));
//开始活动意图
startActivity(intent);
}
});
}
}但是当真正打的时候呢?
当你点击拨号的时候就会报一个权限错误,因为打电话是需要打电话权限的
这里需要打电话的权限,则我们需要在清单文件中进行声明
那么接下来是否就可以呢?结果还是相同的问题,据说低版本安卓上这样就可以运行了,至少adb下可以,因为我们这种直接运行到虚拟机的形式就是adb,可是现在我们的是安卓9,也算是挺高了,那么解决方法就是在虚拟机中找到该软件长按出现app info后点击进去
在permissions中就可以看到刚才我们声明的这个权限
只是没有被勾选而已
将其勾选之后
再次进入程序进行拨打,厉害了吧
关键字词:android,电话