アンドロイド:デフォルトのホームアプリケーションを変更する
-
26-09-2019 - |
質問
いくつかの特定の要件については、カスタマイズされたホームアプリケーション(アプリ内の設定をデフォルトホーム=私のアプリケーションまたは以前のホーム)で変更する必要があります。
ユーザーには非常に複雑な Android 設定を行ってほしくないのです。
デフォルトのホームアプリケーションのためにLauncher.apkを登録する場所やそれを変更する方法のように、誰かが私を助けることができますか
私が見つけられた唯一のことは、次のような古い質問でした。 デフォルトの Android デスクトップ アプリケーションを変更するにはどうすればよいですか?
しかし、まったく答えがありません。
私は市場で HomeSwitcher がうまく機能するのを見てきましたが、確かに忙しいであろう開発者にとっては答えがありませんでした。
編集
これをウェブで見つけました http://www.mail-archive.com/android-developers@googlegroups.com/msg74167.html
しかし、同じ問題が発生しました:
これは私のコードです:
private void makePreferred() {
PackageManager pm = getPackageManager();
IntentFilter f = new IntentFilter("android.intent.action.MAIN");
f.addCategory("android.intent.category.HOME");
f.addCategory("android.intent.category.DEFAULT");
ComponentName cn = new ComponentName("com.example.android.home", "com.example.android.home.Home");
pm.addPreferredActivity(f, IntentFilter.MATCH_CATEGORY_EMPTY, null, cn);
私が持っています android.permission.SET_PREFERRED_APPLICATIONS
マニフェストに設定します。上記のコードを実行した後、ログは、予想されるように追加されたと主張します(IntentResolverのリストから「デフォルトを作成する」をチェックオフするときと同じログ)。ただし、クリックして自宅で続行すると、リストが表示され、ログは次のように表示されます。
INFO/PackageManager(52): Result set changed, dropping preferred
activity for Intent { act=android.intent.action.MAIN cat=
[android.intent.category.HOME] flg=0x10200000 } type null
したがって、リゾルバがデフォルトのエントリを削除しているようです。私は何か間違ったことをしていますか、それともこれはセキュリティ尺度ですか?この背後にあるアイデアは何ですか?
解決
それについて広範囲に調査しましたが、2.2 からはそれを行う方法がありません。唯一の方法は、幼児用ロックアプリが行うハッキングを使用することですが、このアプリは最近サムスンの携帯電話を無限ループに陥らせるため、危険なアプローチです。
froyoのソースコードを見ると ここ packagemanager クラスの addPreferredActivity メソッドに次の小さな条件が表示されます。
if (getUidTargetSdkVersionLockedLP(Binder.getCallingUid())
< Build.VERSION_CODES.FROYO) {
Slog.w(TAG, "Ignoring addPreferredActivity() from uid"
+ Binder.getCallingUid());
return;
}
HomeSwitcher は、まさにこの方法を使用しており、開発者がアプリ ページにコメントを作成しているため、2.2 では正しく動作しません。Froyo(2.2)はAPIの変更のためにサポートされていません"
他のヒント
パッケージのセットが、意図はデフォルトを作成していないときに指定したセットから変更されたことに一致することを意味し、「設定変更を結果」。 (現在nullに設定されている)コンポーネントのリストには、すべてのホームスクリーンが含まれている必要があり、デバイスだけでなく、あなたの上に存在アプリます。
私はadbのシェル午前開始 http://www.google.coを使用して(テストしていることをここでのサンプルコード。英国/ の)と、デフォルトのブラウザを設定するために使用されます。 XXXは私が黒いうちに持っていた顧客の名前を表します。
addPreferredActivityを呼び出すために、あなたは、8(2.2)の最小SDKのバージョンに対してコンパイルされている必要があることに注意して、あなたはSET_PREFERRED_APPLICATIONS権限を指定しておく必要があります。あなたはPackageManagerと同じ証明書で署名する必要があるので、許可には、保護レベル2である。
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.VIEW");
filter.addCategory("android.intent.category.DEFAULT");
filter.addDataScheme("http");
Context context = getApplicationContext();
ComponentName component = new ComponentName("com.opera.mini.XXX", "com.opera.mini.XXX.CustomerBrowser");
ComponentName[] components = new ComponentName[] {new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"),
component};
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_SCHEME, components, component);
ETA - あなたはこのレスポンスダウンをマークした場合、あなたは私がなぜ知っている可能性があります。私は上記の投稿のコードをテストし、働いている...
startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
このコードは、私のICSデバイス上で動作します。私は、そのうちの一つがSET_PREFERRED_LAUNCHERと呼ばれ、いくつかの呼び出しに賢明であるサービスを使用するバンドル内プット新しいデフォルトのランチャーパッケージ(PREFERRED_PACKAGE_KEY)とそれの活動(PREFERRED_ACTIVITY_KEY) P>
Method installPackageMethod = null;
Method deletePackageMethod = null;
Method setPreferredActivityMethod = null;
Method replacePreferredActivityMethod = null;
Object pm = null;
@Override
public void onCreate() {
super.onCreate();
if (pm == null)
pm = getPackageManager();
try {
if (setPreferredActivityMethod == null)
setPreferredActivityMethod = pm.getClass().getMethod(
"addPreferredActivity", IntentFilter.class, int.class,
ComponentName[].class, ComponentName.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private final class ServiceHandler extends Handler {
private Context context;
public ServiceHandler(Looper looper, Context ctx) {
super(looper);
context = ctx;
}
@Override
public void handleMessage(Message msg) {
Intent intent = (Intent) msg.getData().getParcelable(
UPDATER_SERVICE_ACTION);
int request = intent.getIntExtra(
REQUEST_KEY,
REQUEST_UNKNOWN);
Bundle bundle = intent.getExtras();
switch (request) {
case INSTALL_APPLICATION: {
if (bundle != null) {
String appPath = bundle
.getString(APP_PATH_KEY);
if (appPath != null) {
LogUtil.e(TAG, "try to install " + appPath);
try {
am.installPackage(appPath);
} catch (Exception e) {
e.printStackTrace();
}
LogUtil.e(TAG, "install of " + appPath + " done");
}
}
break;
}
case UNISTALL_PACKAGE: {
if (bundle != null) {
String packagename = bundle
.getString(PACKAGE_NAME_KEY);
if (packagename != null) {
LogUtil.e(TAG, "unistall " + packagename);
try {
deletePackageMethod
.invoke(pm, packagename, null, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
}
case SET_PREFERRED_LAUNCHER: {
if (bundle != null) {
String package_name = bundle
.getString(PREFERRED_PACKAGE_KEY);
if (package_name == null) {
LogUtil.e(TAG,
"WARNING: setDefaultActivity cannot continue, package is NULL");
return;
}
String activity_name = bundle
.getString(PREFERRED_ACTIVITY_KEY);
if (activity_name == null) {
LogUtil.e(TAG,
"WARNING: setDefaultActivity cannot continue, activity is NULL");
return;
}
LogUtil.e(TAG, "setDefaultActivity activity="
+ activity_name + " package=" + package_name);
IntentFilter filter = new IntentFilter(
"android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
ComponentName[] components = new ComponentName[] {
new ComponentName("com.android.launcher",
"com.android.launcher2.Launcher"),
new ComponentName(package_name, activity_name) };
ComponentName activity = new ComponentName(package_name,
activity_name);
try {
setPreferredActivityMethod.invoke(pm, filter,
IntentFilter.MATCH_CATEGORY_EMPTY, components,
activity);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
マニフェストファイルにこの権限を追加することを忘れないでください:
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
使用方法:
public void setPreferredLauncher(String activity_name,String package_name)
{
Intent intent = new Intent(UPDATER_SERVICE_ACTION);
intent.putExtra(REQUEST_KEY, SET_PREFERRED_LAUNCHER);
intent.putExtra(PREFERRED_ACTIVITY_KEY, activity_name);
intent.putExtra(PREFERRED_PACKAGE_KEY, package_name);
context.startService(intent);
}
ここで、
public static final String _UPDATER_SERVICE_ACTION = "com.android.updaterservice.ACTION";
public static final String REQUEST_KEY = "com.android.updaterservice.REQUEST_KEY";
public static final String PACKAGE_NAME_KEY = "com.android.updaterservice.PACKAGE_NAME_KEY";
public static final String APP_PATH_KEY = "com.android.updaterservice.APP_PATH_KEY";
public static final String PREFERRED_ACTIVITY_KEY = "com.android.updaterservice.PREFERRED_ACTIVITY_KEY";
public static final String PREFERRED_PACKAGE_KEY = "com.android.updaterservice.PREFERRED_PACKAGE_KEY";
public static final String INSTALL_PACKAGE_RESULT = "com.android.updaterservice.INSTALL_PACKAGE_RESULT";
public static final String PACKAGE_NAME = "PACKAGE_NAME";
public static final String INSTALL_SUCCEEDED = "INSTALL_SUCCEEDED";
public static final int REQUEST_UNKNOWN = -1;
public static final int INSTALL_APPLICATION = 1;
public static final int UNISTALL_PACKAGE = 2;
public static final int SET_PREFERRED_LAUNCHER = 3;