好的,阿杰,我给你整理一份 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 核心特性
- 权限模型改进(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);
}
- Doze 模式与 App Standby
- 系统会在设备闲置时限制后台任务和网络访问。
- 使用 JobScheduler、Firebase Cloud Messaging 适配 Doze。
- 指纹识别
- 提供 FingerprintManager API。
- 支持安全身份认证,如支付或解锁。
- 更细粒度的应用权限
- 用户可以单独允许或禁止某些敏感权限(联系人、存储、麦克风等)。
- 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️⃣ 指纹识别
- 在 Manifest 中添加权限:
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
- 使用
FingerprintManager
验证身份:
FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
if(fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints()) {
// 可使用指纹
}
6️⃣ API 变化及注意事项
功能/类 | Android M 改动 | 开发注意点 |
---|---|---|
权限管理 | 引入 Runtime Permission | targetSdk >= 23 必须处理运行时权限 |
Contacts API | 访问联系人需权限 | READ_CONTACTS 或 WRITE_CONTACTS |
Storage | 外部存储访问需权限 | READ_EXTERNAL_STORAGE 、WRITE_EXTERNAL_STORAGE |
WebView | 默认启用 Chrome 内核 | 注意 JS 与安全设置 |
JobScheduler | 新增 API,替代 AlarmManager 执行后台任务 | Doze 模式下任务执行更可靠 |
FingerprintManager | 新增指纹识别 API | 仅支持 API >= 23 |
7️⃣ 开发建议
- 使用 Runtime Permission 兼容 Android 6.0+。
- Doze 模式 下不要依赖后台服务,改用 JobScheduler。
- 测试多设备,尤其是厂商定制系统对权限和后台限制可能有差异。
- 兼容旧版本,用 Support Library 或 AndroidX 提供的 API。
- 安全优先:敏感权限、存储、指纹操作需加提示和异常处理。
好的,阿杰,我帮你整理一份 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 & 建议
- 权限处理:targetSdk >= 23,所有敏感权限必须运行时申请。
- Doze 模式:避免在后台频繁启动服务,使用 JobScheduler。
- 指纹认证:UI 上给用户提示,否则容易出现错误。
- App Links:开启
android:autoVerify="true"
可以自动关联域名。 - 兼容性:用 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 & 建议
- 权限处理:targetSdk >= 23,所有敏感权限必须运行时申请。
- Doze 模式:避免在后台频繁启动服务,使用 JobScheduler。
- 指纹认证:UI 上给用户提示,否则容易出现错误。
- App Links:开启
android:autoVerify="true"
可以自动关联域名。 - 兼容性:用 Support Library 或 AndroidX 提供的兼容方法。
发表回复