【问题标题】:Android hidden application安卓隐藏应用
【发布时间】:2012-12-21 16:48:00
【问题描述】:

我正在编写一个(合法的)间谍程序。我想让这个程序隐藏在启动器上(这样就不会显示图标)。我试图从AndroidManifest.xml 中删除<category android:name="android.intent.category.LAUNCHER" /> 行,但随后用户无法以首次启动模式(配置)启动应用程序。谁有什么想法?

我该怎么做?

【问题讨论】:

    标签: android hidden launcher


    【解决方案1】:

    您需要将您的应用变成一项服务。以下是 Android 创建服务组件的过程:

    http://developer.android.com/guide/components/services.html

    在 MobiWare 上也发现了这个:

    如果您想在用户不知情的情况下跟踪移动设备的使用情况或收集一些数据,这可能会对您有所帮助。

    第一步:创建一个没有图标的应用程序。 通常,活动在 manifest 中声明如下。

         <activity
            android:label="@string/app_name"
            android:name="org.security.tracker.Tracker-activity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    

    删除类别标签,您将不再获得应用程序图标。 现在,你不再需要活动了。所以删除这个部分。 但是您可能会想,应用程序将如何在没有任何触发器的情况下运行,或者应用程序的起点是什么。 这就是解决方案。

    <!-- Start the Service if applicable on boot -->
        <receiver android:name="org.security.tracker.ServiceStarter" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    

    这会触发您在 Receiver 中编写的代码,您可以运行服务来实现您的想法。

     <service android:name="org.security.tracker.serviceCode" />
    

    你需要添加这个权限,

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

    您的代码仅在手机重启时运行。

    第 2 步。编写代码

    Reboot 后,receiveer 将启动,您可以在此处启动您的服务。

    class ServiceStarter extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context _context, Intent _intent) {
    
        Intent i = new Intent("com.prac.test.MyPersistingService");
        i.setClass(_context, ServiceCode.class);
        _context.startService(i);
      }
    
     }
    

    【讨论】:

    • 如果 androidmanifest 中没有 LAUNCHER 类别,Android Studio 将无法编译
    • 服务代码将如何执行,如果您无法启动应用程序,Android Studio 将不会第一次编译
    • 在我开始活动一次之前在 BroadcastReceiver 中没有收到任何呼叫
    • 嘿,我想效仿你的例子 - 你能澄清一下 MyPersistingService 和 ServiceCode 是什么 - 我无法理解它们是如何实现的。
    【解决方案2】:

    您可以从 AndroidManifest.xml 文件中删除 &lt;category android:name="android.intent.category.LAUNCHER"/&gt;

    但请记住添加 &lt;category android:name="android.intent.category.LEANBACK_LAUNCHER"/&gt; 以便 Android Studio 能够编译您的应用程序(但在启动器中隐藏):) :D

    【讨论】:

      【解决方案3】:

      删除

      <intent-filter >
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
      

      来自清单文件

      【讨论】:

      • @AmitApollo,无需创建服务。
      • 应用程序将如何启动?
      • @Squonk 我不是专家,但也许它是广播接收器?
      • @RicardoCristianRamirez :除非用户“启动”了应用程序,否则您无法启动任何 Android 应用程序组件。这包括服务和广播接收器——出于安全原因,很多版本的 Android 都采用这种方式。
      • 它不会工作,android studio 不会只编译。它会说“未找到默认活动”。
      【解决方案4】:

      应用程序可以通过编程方式隐藏,下面是从启动器菜单中隐藏应用程序的代码。这也适用于android 10

      // App will be hidden when this method will be called from menu
      private fun hideApp() {
      
          val packageManager =packageManager
          val name =ComponentName(this,MainActivity::class.java)
          packageManager.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)
          Log.d("TAG", "hideApp: success")
      }
      

      欲了解更多信息,您可以查看此链接https://developer.android.com/reference/android/content/pm/PackageManager#setComponentEnabledSetting(android.content.ComponentName,%20int,%20int)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 2014-04-19
        • 1970-01-01
        • 2014-02-28
        相关资源
        最近更新 更多