Android小应用之拨号器
首先看一下Android Studio下怎么设置应用的ICON
Activity的onCreate()方法
当界面刚被创建时会回调此方法,super.onCreate()执行父类的初始化操作,必须要加上。
界面设计:
分析:
TextView
Edit
RelativeLayout:相对布局
在字符串上用"Alt+Enter"可以Extract资源。
<TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/title"/>
@string是引用字符串资源里面的变量,避免硬编码,方便国际化。
两个title不会冲突,因为存在于不同的内部类中。
按钮事件
打开另一个Activity
Intent
Intent的常量ACTION
添加拨打电话的权限
package com.example.tuhooo.callyou; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 拨打此号码的按钮被点击时触发 * @param v 视图 */ public void call(View v) { System.out.println("进入拨号按钮回调......"); EditText editNumber = (EditText) findViewById(R.id.number); String phoneNumber = editNumber.getText().toString(); Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); // 指定其动作为拨打电话 String param = "tel:" + phoneNumber; System.out.println("拨号参数为:" + param); intent.setData(Uri.parse(param)); // 指定将要拨出的号码 try { startActivity(intent); // 执行打电话的 } catch (Exception e) { System.out.println(e); } } }
即使这样写仍会报错,因为在Android 6.0对权限管理进行修改了。
下面上网上找了一段可行的代码:
package com.example.tuhooo.callyou; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 拨打此号码的按钮被点击时触发 * @param v 视图 */ public void call(View v) { System.out.println("进入拨号按钮回调......"); if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // 没有获得授权, 申请授权 if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CALL_PHONE)) { Toast.makeText(MainActivity.this, "请授权!", Toast.LENGTH_LONG).show(); Intent applyIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); applyIntent.setData(uri); startActivity(applyIntent); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE); } } else { try { EditText editNumber = (EditText) findViewById(R.id.number); String phoneNumber = editNumber.getText().toString(); Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); // 指定其动作为拨打电话 String param = "tel:" + phoneNumber; System.out.println("拨号参数为:" + param); intent.setData(Uri.parse(param)); // 指定将要拨出的号码 startActivity(intent); // 执行打电话的 } catch (Exception e) { System.out.println(e); } } } }
五大布局Layout:
LinearLayout线性布局
RelativeLayout相对布局
AbsoluteLayout绝对布局
TableLayout表格布局
FrameLayout帧布局