从A应用打开B应用(scheme)
A:
String url = "scheme://mtime/goodsDetail?goodsId=10011002";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
B:
<!-- 要想在别的App上能成功调起App,必须添加intent过滤器 -->
<!-- 如果有多个intent-filter,需要各写各的intent-filter,不然会没有桌面图标 -->
<!-- 协议部分,随便设置 -->
<intent-filter>
<!--协议部分,随便设置-->
<data
android:host="mtime"
android:path="/goodsDetail"
android:scheme="scheme" />
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
锁屏打开应用
1、directboot模式,亲测无效
2、需要锁屏显示权限和后台弹出应用权限,引导设置。并且在setContentView()之前添加:
FLAG_SHOW_WHEN_LOCKED
FLAG_DISMISS_KEYGUARD
FLAG_KEEP_SCREEN_ON
FLAG_TURN_SCREEN_ON
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置点亮屏幕
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
);
setContentView(R.layout.activity_test);
}
还要添加权限:
<!-- 保持屏幕亮起权限 -->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
固定屏幕模式(Lock Task Mode):
1、可通过手动去设置->安全->屏幕固定去开启
2、还有一种就是代码方式,第一步需要激活DeviceAdmin,有个界面,点击激活成功后,会系统弹窗提示屏幕固定,点击确定才真正进入屏幕固定模式
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
omponentName componentName = new ComponentName(this, AdminReceiver.class);
//判断是否已经是设备管理者模式了,返回boolean。
boolean isAdminActive = dpm.isAdminActive(componentName);
if(isAdminActive){
//固定屏幕
startLockTask();
}else {
//主动询问设备管理者权限的逻辑
ComponentName componentName = new ComponentName(this, AdminReceiver.class);
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "请求设备管理权限...");
//不能直接startActivity 因为可能在激活的时候用户点击了取消,这时候CheckBox状态是勾选的,但是实际是没激活的,
startActivityForResult(intent, 100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100) {
//固定屏幕
startLockTask();
}
}
public class AdminReceiver extends DeviceAdminReceiver {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d("MainActivity","设备管理=onReceive");
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
Log.d("MainActivity","设备管理=onDisableRequested");
return super.onDisableRequested(context, intent);
}
@Override
public void onDisabled(Context context, Intent intent) {
super.onDisabled(context, intent);
Log.d("MainActivity","设备管理=onDisabled");
}
@Override
public void onEnabled(Context context, Intent intent) {
super.onEnabled(context, intent);
Log.d("MainActivity","设备管理=onEnabled");
}
}
<receiver
android:name=".AdminReceiver"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
device_admin.xml:
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<!--停用相机-->
<disable-camera/>
<!--锁屏时禁用某些功能-->
<disable-keyguard-features/>
<!--设置存储设备加密-->
<encrypted-storage/>
<!--设置锁定屏幕密码的有效期-->
<expire-password/>
<!--锁定屏幕-->
<force-lock/>
<!--设置密码规则-->
<limit-password/>
<!--更改屏幕解锁密码-->
<reset-password/>
<!-- <!–设置设备全局代理–>
<set-global-proxy/>-->
<!--监控屏幕解锁尝试次数-->
<watch-login/>
<!--恢复出厂设置-->
<wipe-data/>
</uses-policies>
</device-admin>
DevicePolicyManager
1、DevicePolicyManager还可以一键锁屏、重置锁屏密码、禁止卸载应用,禁用相机蓝牙、禁止下拉状态栏和禁止截屏等功能
2、禁止截屏还可以使用:getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
护眼模式
private FrameLayout view;
/**
* 添加护眼模式浮层
*/
protected void initEye() {
ViewGroup content = ((ViewGroup) findViewById(android.R.id.content));
view = new FrameLayout(this);
view.setBackgroundColor(Color.TRANSPARENT);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
content.addView(view, params);
}
/**
* 开启护眼模式
*/
public void openEye() {
view.setBackgroundColor(getFilterColor(30));
}
/**
* 关闭护眼模式
*/
public void closeEye() {
view.setBackgroundColor(Color.TRANSPARENT);
}
/**
* 过滤蓝光
*
* @param blueFilterPercent 蓝光过滤比例[10-30-80]
*/
public int getFilterColor(int blueFilterPercent) {
int realFilter = blueFilterPercent;
if (realFilter < 10) {
realFilter = 10;
} else if (realFilter > 80) {
realFilter = 80;
}
int a = (int) (realFilter / 80f * 180);
int r = (int) (200 - (realFilter / 80f) * 190);
int g = (int) (180 - (realFilter / 80f) * 170);
int b = (int) (60 - realFilter / 80f * 60);
return Color.argb(a, r, g, b);
}
获取已安装应用列表(仿桌面)
PackageManager pm = this.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN,null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> list = pm.queryIntentActivities(intent,PackageManager.PERMISSION_GRANTED);
for (int i = 0; i < list.size(); i++) {
ResolveInfo resolveInfo = list.get(i);
//应用图标
imageView.setImageDrawable(resolveInfo.activityInfo.applicationInfo.loadIcon(pm));
//应用名称
textView.setText(resolveInfo.activityInfo.applicationInfo.loadLabel(pm));
//应用包名
appPackageName = resolveInfo.activityInfo.packageName;
}
//点击图标打开应用
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = getPackageManager().getLaunchIntentForPackage(appPackageName);
startActivity(intent);
}
});
应用内安装
1、代码部分
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val canRequestPackageInstalls = packageManager.canRequestPackageInstalls()
if (!canRequestPackageInstalls) {
val packageURI = Uri.parse("package:" + packageName);
val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, 1002);
}
}
public void installApk(File file) {
try {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".fileprovider", file);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
2、xml配置部分
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo.test">
<!-- 读写文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--安装apk需要-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".ui.activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<root-path
name="camera_photos"
path="" />
<external-path
name="files_root"
path="download" />
<external-path
name="external_storage_root"
path="." />
</paths>
</resources>
开发系统应用
1、在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性
2、用系统签名文件对应用进行签名