有趣的Android编程(3)快速打电话的小实例(用了内容提供器:Content Provider)

       最近重新学习时发现了当时写的比较有意思的小实例给大家分享一下,具体的功能就是可以一键打出去电话,点击一下app立马就开始打电话,不用按联系人,与按电话号码。算是比较简单而且比较有意思的小实例了,新人小伙伴也可以学一学的。 

     首先关于内中提供器干什么的,说白了就是可以让别的程序访问自己所用的东西,但这样做听起来就很危险,你想啊,如果你随便就写一个app都可以调用手机上的数据,那得多恐怖啊。所以在Android6.0之后有些比较危险得权限就不能像网络权限这种权限,只在Manifest文件中注册一下就行了,而是要额外申请一下.(当然注册还是得注册得,别忘了啊)。所谓权限的申请估计兄弟们都是很熟悉的,上个图就明白了。

这就是关于危险权限的申请啦,如果是非官方软件的话,在点击这些权限的时候要慎重,以防上当。

下面开始说一下关于我们这次所做的app,由于是要实现快速打电话所以当然要注册打电话的权限啦,现在Manifest中注册

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.provider_1_test">
<uses-permission android:name="android.permission.CALL_PHONE"/>//这里是要加上的部分,其他按自己的来。
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/shop"
        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>

这里给上全代码把,以免有些兄弟不知道往哪加。(可能是博主想多了)

//完整的代码在最后边,兄弟们可以先复制一下代码,看看可不可以运行,因为毕竟博客都是过去时,如果有些方法被淘汰,或者有更简单的方法实现,那先看解释就有点浪费时间了。(不要问为什么,博主血的教训<难受>)

下面就是关于危险权限的申请问题了,首先。在申请之前要判断是不是已经有了,要不重复申请也没什么意义。

//判断是否申请了权限
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED)
{
    //如果没有申请的话就申请
    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}
else
{
    //如果申请了的话
    startActivity(call());
}
finish();

上面的代码,先看if的部分,

ContextCompat.checkSelfPermission()方法可以看是否申请了权限,这个方法的第一个参数是上下文,就是"当前类名.class",第二个当然就是权限名了,而后面的Mainifest.permission.CALL_PHONE,代表的就是"是的"的意思,说白的就是如果和它相等,就是已经申请过了。(这里博主用的是不等于,当然就是反过来的啦)。

申请过了就说明手机允许打电话了,可以进行打电话的代码了startActivity(call())。关于call方法,在下面说明。

如果没有申请过的,或者申请失败的话,就要申请。申请的时候用到了方法: ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);关于这个方法,第一个参数,为上下文,第二个为含有需要权限的数组,第三个为申请的请求码,说白了就是让接收的知道是谁发出的申请。这个必须是唯一的。这里我们把它设为1.

然后就是最后的finish()啦。

这个方法会让app结束,因为我们这些代码是写在onCreate方法中的,说白了就是只有程序刚开始运行的时候会进行打电话操作。所以打电话的操作,进行完把app关了,再点击的时候就可以再次电话了。如果没有这个方法的话,当你电话打完之后app没有关闭而是最小化了,你还得手动关闭,太麻烦啦。

然后看一下方法call()

public Intent call()
{
    Intent intent=new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:10086"));
    return intent;
}

这个方法定义了一个隐式的intent。构造参数为Intent.ACTION_CALL,就是告诉这个intent为打电话的intent,在它的setData中指定号码,然后返回这个intnet,在上面的代码中startActivity()一下就可以了。

//这里的号码是写死的,因为博主感觉这个app为的就是方便,如果可以在app里改打的号码的话,还不如用通讯录方便一些呢。然后就是为什么startActivity()不写在call()方法中,因为这种Intent在startActcity()的时候必须放在判断是否有权限的if中,(大家可以试一下看看行不行,反正Android studio 3.2是不行的)

然后就是关于申请之后的结果问题啦,因为就算申请权限页面出来了,我们也可以点否啊,所以还是判断一下的。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode)
    {
        case 1:
            if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED)
            {
                startActivity(call());
            }
            break;
        default:
                break;
    }
}

这就是关于申请权限结果的方法,可以按ctrl+o来添加方法,这个方法有三个参数,第一个为咱们刚才申请的时候传入的求码,第二个数组保存的权限名,第三个数组保存的为申请结果。(因为可以申请多个权限的,但我们这里只有一个,所以只有一个结果,一个权限)。然后和上面的代码一样与PackageManager.PERMISSION_GRANTED比较,如果一样的话,就可以打电话。

关于这个小实例的全部代码:(没有改主页的xml文件,因为没有意义,只有Manifest中改的代码与MainActvity的代码就可以实现)

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
/*
* 直接打给的app
* */
public class MainActivity extends AppCompatActivity {

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode)
        {
            case 1:
                if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED)
                {
                    startActivity(call());
                }
                break;
            default:
                    break;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //判断是否申请了权限
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED)
        {
            //如果没有申请的话就申请
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
        }
        else
        {
            //如果申请了的话
            startActivity(call());
        }
        finish();
    }
    public Intent call()
    {
        Intent intent=new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        return intent;
    }
}

这就是关于一个快速打电话的小实例啦,感觉这个小实例应该比较简单易懂而且还可以让兄弟们学到东西,而且就算是小白,看了之后理解一下应该也可以学会的。

 

//如果代码有问题,或者对这个小实例有不懂的可以私信或留言的。博主会实时关注的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值