安卓基础使用案例

从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/>
		<!-- &lt;!&ndash;设置设备全局代理&ndash;&gt;
		 <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、用系统签名文件对应用进行签名

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值