admin管理员组

文章数量:1558087

初衷

自己给车机买了CarPlay盒子,但是车机启动后需要点击App才能使用,十分拉闸!!!所以做了这个自启动器。

README!

因为
它是apk文件
它是基于安卓4.4开发的

所以
它能安装到所有的安卓平台上
它只能安装到安卓4.4以后的机子上

开发

开机程序自启代码【主要在AndroidManifest.xml】

// An highlighted block
<manifest xmlns:android="http://schemas.android/apk/res/android"
    android:installLocation="internalOnly"
    xmlns:tools="http://schemas.android/tools">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!--    悬浮窗-->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.APP_MAPS"/>
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <receiver
            android:name=".BaseReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

主要的逻辑代码

//展示包名
        try {
            Context ctx = MainActivity.this;
            PackageManager packageManager = ctx.getPackageManager();
            //获取所有安装的app
            List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
            ArrayList<String> listItem = new ArrayList<String>();
            for(PackageInfo info : installedPackages){
                String packageName = info.packageName;//app包名
                ApplicationInfo ai = packageManager.getApplicationInfo(packageName, 0);
                String appName = (String) packageManager.getApplicationLabel(ai);//获取应用名称
                String showItem = appName + "____" + packageName;
                listItem.add(showItem);
            }
            ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItem);

            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new MyOnItemClickListener());
        }catch (Exception ex){}
        //申请悬浮窗权限
        try{
            //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
                //没有权限,须要申请权限,由于是打开一个受权页面,因此拿不到返回状态的,因此建议是在onResume方法中重新执行一次校验
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                intent.setData(Uri.parse("package:" + getPackageName()));
                startActivity(intent);
            }
        }catch (Exception ex){}
        //启动跳转程序
        String ss = "";
        try{
            //启动从文件中读取包名字
            Context ctx = MainActivity.this;
            SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
            EditText editText = findViewById(R.id.txtPackName);
            editText.setText(sp.getString("PKG", "none"));
            ss = sp.getString("PKG", "none");
        }catch (Exception ex){}
        //第一种方式启动
        try {
            if(!ss.equals("none")){
                Intent intent = getPackageManager().getLaunchIntentForPackage(ss);
                if (intent != null) {
                    intent.putExtra("type", "110");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }
        }
        catch(Exception ex) {}
        //第二种方式启动
        try {
            if(!ss.equals(("none"))){
                Intent intent = new Intent();
                ComponentName cn = new ComponentName(ss, ss+".MainActivity");
                intent.setComponent(cn);
                startActivity(intent);
            }
        }catch (Exception ex){}

效果

启动后调到对应的App

结语

接触Android半天,简单搞了一下的作品,大佬手下留情,望海涵!
ps:
坑是真多
1、Debug的apk安装不到车机上
2、自己的安卓车机是厂家定制的没有开机广播…所以把应用做成了桌面应用
3、Android studio竟然是全英文的,没有官方汉化…
都是泪…

本文标签: 两种方式app到安卓