好的,阿杰,我给你整理一份 Android M(Android 6.0 Marshmallow)系统开发指南,覆盖开发环境搭建、核心特性、权限管理、API 变化等重点内容,方便你开发 Android M 相关应用。


Android M 系统开发指南(Android 6.0 Marshmallow)


1️⃣ 开发环境搭建

1.1 SDK 和 IDE

  • Android Studio 2.x 或以上 推荐使用。
  • 安装 Android SDK Platform 23(对应 Android 6.0)。
  • 安装 Android Support Library 和 Google Repository 以便兼容旧版本。

1.2 配置模拟器

  • 系统映像选择 API Level 23
  • 建议开启 Intel HAXM 加速,提高模拟器性能。

1.3 Gradle 配置

在 build.gradle 中指定:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.androidm"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
}


2️⃣ Android M 核心特性

  1. 权限模型改进(Runtime Permission)
    • 运行时请求权限,用户可拒绝。
    • API: ContextCompat.checkSelfPermission() + ActivityCompat.requestPermissions()
    • 示例:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 101);
}

  1. Doze 模式与 App Standby
    • 系统会在设备闲置时限制后台任务和网络访问。
    • 使用 JobSchedulerFirebase Cloud Messaging 适配 Doze。
  2. 指纹识别
    • 提供 FingerprintManager API
    • 支持安全身份认证,如支付或解锁。
  3. 更细粒度的应用权限
    • 用户可以单独允许或禁止某些敏感权限(联系人、存储、麦克风等)。
  4. App Links
    • 支持自动将 URL 与应用关联,而不弹出选择对话框。

3️⃣ 权限管理详解

3.1 检查权限

int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
if (permission != PackageManager.PERMISSION_GRANTED) {
    // 未授权
}

3.2 请求权限

ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.READ_CONTACTS},
        1001);

3.3 处理用户选择

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 1001) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限允许
        } else {
            // 权限拒绝
        }
    }
}


4️⃣ Doze 模式适配

  • 使用 JobScheduler 执行后台任务,确保在 Doze 模式下延迟执行。
  • 示例:
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(this, MyJobService.class))
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPersisted(true)
        .build();
jobScheduler.schedule(jobInfo);


5️⃣ 指纹识别

  1. 在 Manifest 中添加权限:
<uses-permission android:name="android.permission.USE_FINGERPRINT" />

  1. 使用 FingerprintManager 验证身份:
FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
if(fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints()) {
    // 可使用指纹
}


6️⃣ API 变化及注意事项

功能/类Android M 改动开发注意点
权限管理引入 Runtime PermissiontargetSdk >= 23 必须处理运行时权限
Contacts API访问联系人需权限READ_CONTACTS 或 WRITE_CONTACTS
Storage外部存储访问需权限READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
WebView默认启用 Chrome 内核注意 JS 与安全设置
JobScheduler新增 API,替代 AlarmManager 执行后台任务Doze 模式下任务执行更可靠
FingerprintManager新增指纹识别 API仅支持 API >= 23

7️⃣ 开发建议

  1. 使用 Runtime Permission 兼容 Android 6.0+。
  2. Doze 模式 下不要依赖后台服务,改用 JobScheduler。
  3. 测试多设备,尤其是厂商定制系统对权限和后台限制可能有差异。
  4. 兼容旧版本,用 Support Library 或 AndroidX 提供的 API。
  5. 安全优先:敏感权限、存储、指纹操作需加提示和异常处理。

好的,阿杰,我帮你整理一份 Android M 核心 API 示例合集,涵盖 运行时权限、Doze 模式(JobScheduler)、指纹识别、App Links,你可以直接拿来在项目里用。


Android M 核心 API 示例合集(Android 6.0)


1️⃣ 运行时权限(Runtime Permission)

1.1 检查权限

import android.content.pm.PackageManager;
import androidx.core.content.ContextCompat;

int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if (permission != PackageManager.PERMISSION_GRANTED) {
    // 未授权,准备申请权限
}

1.2 请求权限

import androidx.core.app.ActivityCompat;

ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.CAMERA},
        101); // 101 是请求码

1.3 处理权限回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 101) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户允许权限
        } else {
            // 用户拒绝权限
        }
    }
}


2️⃣ Doze 模式 & JobScheduler

2.1 创建 JobService

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;

public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d("MyJobService", "Job started");
        // 执行后台任务
        jobFinished(params, false);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false; // 如果任务中断,是否重新调度
    }
}

2.2 调度任务

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;

JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(this, MyJobService.class))
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPersisted(true) // 重启后依然有效
        .setPeriodic(15 * 60 * 1000) // 每 15 分钟执行一次
        .build();

jobScheduler.schedule(jobInfo);

注意:JobScheduler 可以在 Doze 模式下延迟任务,适合后台同步或上传任务。


3️⃣ 指纹识别(FingerprintManager)

3.1 添加权限

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

3.2 使用指纹识别

import android.hardware.fingerprint.FingerprintManager;
import android.os.CancellationSignal;

FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

if(fingerprintManager != null 
   && fingerprintManager.isHardwareDetected() 
   && fingerprintManager.hasEnrolledFingerprints()) {

    CancellationSignal cancellationSignal = new CancellationSignal();

    fingerprintManager.authenticate(null, cancellationSignal, 0,
        new FingerprintManager.AuthenticationCallback() {
            @Override
            public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                // 验证成功
            }

            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                // 验证失败
            }
        }, null);
}


4️⃣ App Links(深度链接)

4.1 在 Manifest 声明 Activity 支持 App Links

<activity android:name=".DeepLinkActivity">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="https"
              android:host="www.example.com"
              android:pathPrefix="/open"/>
    </intent-filter>
</activity>

4.2 处理链接

import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class DeepLinkActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deep_link);

        Uri data = getIntent().getData();
        if(data != null){
            String path = data.getPath();
            // 根据 path 处理业务逻辑
        }
    }
}


5️⃣ 外部存储访问权限

  • Android M 强制要求外部存储读写权限运行时申请:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 102);
}


6️⃣ Tips & 建议

  1. 权限处理:targetSdk >= 23,所有敏感权限必须运行时申请。
  2. Doze 模式:避免在后台频繁启动服务,使用 JobScheduler。
  3. 指纹认证:UI 上给用户提示,否则容易出现错误。
  4. App Links:开启 android:autoVerify="true" 可以自动关联域名。
  5. 兼容性:用 Support Library 或 AndroidX 提供的兼容方法。

如果你愿意,我可以帮你整理一个 Android M 项目模板 Demo,里面包含:

  • 运行时权限处理
  • JobScheduler 示例
  • 指纹登录
  • App Links 测试

这样你可以直接跑起来做实验。

你希望我帮你做这个模板吗?好的,阿杰,我帮你整理一份 Android M 核心 API 示例合集,涵盖 运行时权限、Doze 模式(JobScheduler)、指纹识别、App Links,你可以直接拿来在项目里用。


Android M 核心 API 示例合集(Android 6.0)


1️⃣ 运行时权限(Runtime Permission)

1.1 检查权限

import android.content.pm.PackageManager;
import androidx.core.content.ContextCompat;

int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if (permission != PackageManager.PERMISSION_GRANTED) {
    // 未授权,准备申请权限
}

1.2 请求权限

import androidx.core.app.ActivityCompat;

ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.CAMERA},
        101); // 101 是请求码

1.3 处理权限回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 101) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户允许权限
        } else {
            // 用户拒绝权限
        }
    }
}


2️⃣ Doze 模式 & JobScheduler

2.1 创建 JobService

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;

public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d("MyJobService", "Job started");
        // 执行后台任务
        jobFinished(params, false);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false; // 如果任务中断,是否重新调度
    }
}

2.2 调度任务

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;

JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(this, MyJobService.class))
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPersisted(true) // 重启后依然有效
        .setPeriodic(15 * 60 * 1000) // 每 15 分钟执行一次
        .build();

jobScheduler.schedule(jobInfo);

注意:JobScheduler 可以在 Doze 模式下延迟任务,适合后台同步或上传任务。


3️⃣ 指纹识别(FingerprintManager)

3.1 添加权限

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

3.2 使用指纹识别

import android.hardware.fingerprint.FingerprintManager;
import android.os.CancellationSignal;

FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

if(fingerprintManager != null 
   && fingerprintManager.isHardwareDetected() 
   && fingerprintManager.hasEnrolledFingerprints()) {

    CancellationSignal cancellationSignal = new CancellationSignal();

    fingerprintManager.authenticate(null, cancellationSignal, 0,
        new FingerprintManager.AuthenticationCallback() {
            @Override
            public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                // 验证成功
            }

            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                // 验证失败
            }
        }, null);
}


4️⃣ App Links(深度链接)

4.1 在 Manifest 声明 Activity 支持 App Links

<activity android:name=".DeepLinkActivity">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="https"
              android:host="www.example.com"
              android:pathPrefix="/open"/>
    </intent-filter>
</activity>

4.2 处理链接

import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class DeepLinkActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deep_link);

        Uri data = getIntent().getData();
        if(data != null){
            String path = data.getPath();
            // 根据 path 处理业务逻辑
        }
    }
}


5️⃣ 外部存储访问权限

  • Android M 强制要求外部存储读写权限运行时申请:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 102);
}


6️⃣ Tips & 建议

  1. 权限处理:targetSdk >= 23,所有敏感权限必须运行时申请。
  2. Doze 模式:避免在后台频繁启动服务,使用 JobScheduler。
  3. 指纹认证:UI 上给用户提示,否则容易出现错误。
  4. App Links:开启 android:autoVerify="true" 可以自动关联域名。
  5. 兼容性:用 Support Library 或 AndroidX 提供的兼容方法。