系列文章目录
文章目录
(先读我)重要提示(先读我)
- 这个实验好像不需要验收,为了专栏完整性我就写了。
- 按照我的做比较好,因为老师给的代码和方法都有几个小问题,我在最后会说
- 这个实验很简单,大概30分钟足够了(配置好环境的话,配置环境要下载一大堆东西)
实验用的IDE是IDEA,环境都是一键配置的
实验目的
安装配置好Android开发环境,并使用其开发Android手机拨号器。
实验对应知识点
Android的应用编程框架以及Android API的使用。
实验步骤
配置环境并新建项目
打开IDEA,选择左上角
File -> New -> Project
左边选择Andriod
我现在已经安装好环境了,没有没安装环境的截图,按理来说一直点next和Finish他就会自动下载,等着下载完就行了。
(有的同学下载完复制完代码后还是报错(标红/编译不过),但是我没有出现错误,所以也不知道可能的解决办法,可以百度一下具体的报错信息)
自动安装完后应该显示如下图:
我们选择第四个,Empty Activity点Next
然后选配置如下图,一般选4.1版本如红框,name改一个自己看着舒服的名字就行,我改成Myphone
然后新建好项目如图:
红框标出等会我们需要修改的文件
然后我们关注一下右上角,如下图
在红框的地方我们可以选择我们的andriod虚拟机
等会写好应用,点绿色的运行符号就会自动安装到我们的andriod虚拟机里并运行了
现在我已经下载好了一个型号为Pixel2 的虚拟机
如果你自己用的手机是andriod或者能借到室友的手机的话,虚拟机的安装不是必须的步骤(仅仅为了最后测试效果),具体方法我最后在“最后一步:测试” 那里会讲到
我们可以根据下面三张图来下载我们的andriod虚拟机,很简单不做累述了
好啦,大功告成!
我们现在开始写代码!
开始写代码
MainActivity.java
首先我们打开MainActivity.java文件,这里面主要是等会在前端视图层按钮点击的对应处理方法
比如记录输入的数字啦,删除数字啦,拨打电话啦等等~
package com.example.myphone;
import android.content.Intent;
import android.net.Uri;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText)this.findViewById(R.id.editText1);
}
public void click(View view){
String str = et.getText().toString();
str += view.getTag().toString();
et.setText(str);
}
public void dial(View view){
String str = et.getText().toString();
if((str != null) && !str.trim().equals("")){
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + str));
startActivity(intent);
}else{
Toast.makeText(MainActivity.this,"请点击拨号按钮",Toast.LENGTH_LONG).show();
}
}
public void del(View view){
String str = et.getText().toString();
if((str != null) && !str.trim().equals("")){
str = str.substring(0,str.length() - 1);
et.setText(str);
}
}
}
activity_main.xml
然后打开activity_main.xml文件,这个文件主要是视图层的东西
你既可以用拖动滑块的方式生成代码,也可以写代码渲染视图,是一样的!
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="2"
android:ems="10"
android:focusable="false"
android:hint="请输入号码" >
<requestFocus />
</EditText>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_marginTop="20dp"
android:layout_weight="12" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n1"
android:tag="1" />
<ImageButton
android:id="@+id/imageButton2"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n2"
android:tag="2" />
<ImageButton
android:id="@+id/imageButton3"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n3"
android:tag="3" />
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<ImageButton
android:id="@+id/imageButton4"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n4"
android:tag="4" />
<ImageButton
android:id="@+id/imageButton5"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n5"
android:tag="5" />
<ImageButton
android:id="@+id/imageButton6"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n6"
android:tag="6" />
</TableRow>
<TableRow
android:id="@+id/tableRow3"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<ImageButton
android:id="@+id/imageButton7"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n7"
android:tag="7" />
<ImageButton
android:id="@+id/imageButton8"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n8"
android:tag="8" />
<ImageButton
android:id="@+id/imageButton9"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n9"
android:tag="9" />
</TableRow>
<TableRow
android:id="@+id/tableRow4"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<ImageButton
android:id="@+id/imageButton10"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/star"
android:tag="*" />
<ImageButton
android:id="@+id/imageButton11"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/n0"
android:tag="0" />
<ImageButton
android:id="@+id/imageButton12"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/sharp"
android:tag="#" />
</TableRow>
<TableRow
android:id="@+id/tableRow5"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<ImageButton
android:id="@+id/imageButton13"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="click"
android:src="@drawable/add_n"
android:tag="+" />
<ImageButton
android:id="@+id/imageButton14"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="dial"
android:src="@drawable/dialpad"
android:tag="dial" />
<ImageButton
android:id="@+id/imageButton15"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/bg_alibuybutton"
android:onClick="del"
android:src="@drawable/delete_n"
android:tag="del" />
</TableRow>
</TableLayout>
</LinearLayout>
</RelativeLayout>
点击右上角的design,可以看到我们写好代码后视图就已经出来了
但是你们应该只有右边和我一样,左边不太一样(同时代码部分也有标红报错),为什么呢?
因为我们还没有添加资源文件!
这些1234567890数字,和加号电话删除符号都是图片!所以我们需要把这些资源文件放到项目里
在 那个 网址上找到老师给的资源文件,并复制进项目红框所示文件夹下
如下图所示:
指导文件让放在绿色框文件夹下,但是代码给的路径就是红色框!!
这就是我前面说的指导文件的坑之一。
虽然很简单,但是指导文件犯这种简单的错误还是让人忍不住吐槽
(不想找的小伙伴可以直接看我github项目中有)
AndriodManifest.xml
最后打开这个文件,加一句话,就是给我们这个应用加拨号的权限
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myphone">
<uses-permission android:name="android.permission.CALL_PHONE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="zxc自制拨号器"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
最后一步:测试
都写好之后点击右上角运行
如果配置好andriod虚拟机的小伙伴虚拟机选好虚拟机就会启动啦,稍等片刻~~~~~
没配置虚拟机的小伙伴可以连接USB连接自己的andriod手机
然后在手机的开发者工具里打开USB连接调试(进开发者模式的办法自行百度很简单)
然后连接上选择连接模式为:文件传输
然后在稍等片刻就会看到自己的手机型号显示在显示虚拟机那里,点击运行稍等片刻就可以在自己的手机上看到啦!
下面我们展示一下虚拟机的预览页面
出结果了,爱了爱了
但是!!!问题又来了!
我们输完号码,点击拨号,居然闪退了!!!!(在真实手机上也是一样的),咋回事呢?
研究后发现,不管是在真实手机还是虚拟机上,这个应用的电话权限都是默认拒绝的,我们需要在应用管理的界面把这个权限设置为允许才行!
如图:
这是真的超级大坑!
指导书里根本就没提过:)
至此,实验结束。
github传送门
总结
预备实验,比较简单。几个小坑列举一下:
-
指导书有一处代码与图片不符
-
资源放置路径指导书和实际代码不一致
-
手机或者模拟机不开权限点拨打电话键会闪退,指导书好像没有提到