2012年10月15日月曜日

Launcherからアプリを消したい

Launcherから消し去りたい

アプリのLauncher表示の切り替えをしたくてPackageManager#setComponentEnabledSettingを使い切り替えるコードを書きました。

PackageManager#setComponentEnabledSettingについてはこちら

Taosoftware: Android Intent呼び出しを自分でコントロール方法  http://www.taosoftware.co.jp/blog/2010/04/android_intent.html  

taosoftwareさんではACTION_VIEW/CATEGORY_BROWSABLEのActivityの切り替えをしていますが、ACTION_MAIN/CATEGORY_LAUNCHERのActivityの切り替えをしたらLauncherからの非表示ができるのではないかと考えたわけです。

検証用のコードはこちら

SettingActivity
import android.content.ComponentName;  import android.content.SharedPreferences;  import android.content.SharedPreferences.OnSharedPreferenceChangeListener;  import android.content.pm.PackageManager;  import android.os.Bundle;  import android.preference.PreferenceActivity;  import android.preference.PreferenceManager;    public class SettingActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {    @Override    protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      addPreferencesFromResource(R.xml.setting);        int state = getPackageManager().getComponentEnabledSetting(new ComponentName(this, SettingActivity.class));      if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_1", true);      } else {        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_1", false);      }        state = getPackageManager().getComponentEnabledSetting(new ComponentName(this, SettingActivity.class));      if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_2", true);      } else {        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_2", false);      }    }      @Override    protected void onResume() {      super.onResume();      PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);    }      @Override    protected void onPause() {      super.onPause();      PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);    }      @Override    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {      int newState;      if (sharedPreferences.getBoolean(key, true)) {        newState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;      } else {        newState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;      }      String packageName = getPackageName();      ComponentName componentName;      if (key.equals("visible_in_launcher_1")) {        componentName = new ComponentName(packageName, packageName + ".SettingActivity");      } else {        componentName = new ComponentName(packageName, packageName + ".SettingActivityAlias");      }      PackageManager packageManager = getPackageManager();      packageManager.setComponentEnabledSetting(componentName, newState, PackageManager.DONT_KILL_APP);    }  }  
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>  <manifest    xmlns:android="http://schemas.android.com/apk/res/android"    package="jp.tomorrowkey.android.visibleinlauncherapp"    android:versionCode="1"    android:versionName="1.0">    <application      android:icon="@drawable/icon"      android:label="@string/app_name">      <activity        android:name=".SettingActivity"        android:label="App1"        android:enabled="true">        <intent-filter>          <action            android:name="android.intent.action.MAIN" />          <category            android:name="android.intent.category.LAUNCHER" />        </intent-filter>      </activity>      <activity-alias        android:name=".SettingActivityAlias"        android:targetActivity=".SettingActivity"        android:label="App2"        android:enabled="true">        <intent-filter>          <action            android:name="android.intent.action.MAIN" />          <category            android:name="android.intent.category.LAUNCHER" />        </intent-filter>      </activity-alias>      <receiver        android:name=".PackageChangedReceiver">        <intent-filter>          <action            android:name="android.intent.action.PACKAGE_CHANGED" />          <data            android:scheme="package" />        </intent-filter>      </receiver>    </application>    <uses-sdk      android:minSdkVersion="3" />  </manifest>   

ちょっとわけあってsetComponentEnabledSettingでenableを切り替えるActivityを2つにしています。

また、setComponentEnabledSettingを使って変更をするとPACKAGE_CHANGEDがブロードキャストされるので、ブロードキャストされたことを分かりやすく見せるためにToastを表示するようにしています。

package jp.tomorrowkey.android.visibleinlauncherapp;    import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent;  import android.widget.Toast;    public class PackageChangedReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {      Toast.makeText(context, "receive package changed", Toast.LENGTH_SHORT).show();    }  }  

動かない…

まず、Launcherの状態がこちら

f:id:tomorrowkey:20101207070948p:image:w200

アプリを起動するとこんな画面が表示されます。

f:id:tomorrowkey:20101207070947p:image:w200

1のチェックボックスを外すと

f:id:tomorrowkey:20101207070949p:image:w200

PACKAGE_CHANGEDが受信され

f:id:tomorrowkey:20101207070951p:image:w200

LauncherからApp1のリンクが消えます。

f:id:tomorrowkey:20101207070950p:image:w200

思ったように動きます。

ここからが問題です。

この状態でApp2のチェックボックスを外すと…

f:id:tomorrowkey:20101207070952p:image:w200

PACKAGE_CHANGEDが受信され

f:id:tomorrowkey:20101207070953p:image:w200

Launcherから消えない…

f:id:tomorrowkey:20101207070954p:image:w200

なぜか消えません…

ちなみに起動しようとしてみると

f:id:tomorrowkey:20101207070955p:image:w200

「アプリがインストールされてません」って言われます…

どうも、最後の1つは消えてくれないようです。

検証Homeアプリ
  • GalaxyS純正Launcher
    • 消えない
  • HT-03A純正Launcher
    • 消えない
  • ADWLauncher
    • 消えない
  • Xperia(1.6)純正Launcher
    • 消える
  • Xperia mini pro(1.6)純正Launcher
    • 1つも消えない

どうにかしてLauncherから消す方法はないでしょうか…。

知っている方おしえてください…

apk

VisibleInLauncherApp.apk 直

コード

http://code.google.com/p/tomorrowkey/source/browse/#svn/trunk/VisibleInLauncherApp

0 件のコメント:

コメントを投稿