Android检测是否插卡

在Android设备中,我们经常需要检测是否插入了SD卡或SIM卡。这对于我们开发一些需要依赖卡片的功能的应用程序非常重要。本文将介绍如何使用Android的API来检测设备是否插卡,并提供相应的代码示例。

检测SD卡是否插入

首先,我们来看如何检测SD卡的插入状态。我们可以通过检查Environment.getExternalStorageState()方法返回的状态来确定SD卡是否可用。如果返回的状态是Environment.MEDIA_MOUNTED,那么表示SD卡已经挂载并且可用。

String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
    // SD卡已插入且可用
} else {
    // SD卡未插入或不可用
}

检测SIM卡是否插入

要检测SIM卡的插入状态,我们可以使用TelephonyManager类。首先,我们需要获取一个TelephonyManager的实例:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

然后,我们可以调用getSimState()方法来获取SIM卡的状态。如果返回的状态是TelephonyManager.SIM_STATE_READY,那么表示SIM卡已插入并且可用。

int simState = telephonyManager.getSimState();
if (TelephonyManager.SIM_STATE_READY == simState) {
    // SIM卡已插入且可用
} else {
    // SIM卡未插入或不可用
}

完整示例代码

下面是一个完整的示例代码,演示了如何检测设备中的SD卡和SIM卡的插入状态:

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_PERMISSION = 1;

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

        // 检查读取SD卡的权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
        } else {
            checkSDCardState();
        }

        // 检查读取电话状态的权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_PERMISSION);
        } else {
            checkSimCardState();
        }
    }

    private void checkSDCardState() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            Toast.makeText(this, "SD卡已插入", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "SD卡未插入", Toast.LENGTH_SHORT).show();
        }
    }

    private void checkSimCardState() {
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        int simState = telephonyManager.getSimState();
        if (TelephonyManager.SIM_STATE_READY == simState) {
            Toast.makeText(this, "SIM卡已插入", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "SIM卡未插入", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    checkSDCardState();
                    checkSimCardState();
                } else {
                    Toast.makeText(this, "权限被拒绝,无法检测插卡状态", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

流程图

下面是一个流程图,展示了如何检测设备中的SD卡和SIM卡的插入状态:

flowchart TD
    start[开始]
    checkPermission[检查权限]
    checkPermission -- 有权限 --> checkSDCardState[检测SD卡状态]
    checkPermission -- 无权限 --> requestPermission[请求权限]
    requestPermission -- 允