Xposed, как создать модуль с экраном настроек GUI

Я создаю модуль для Xposed, он делает то, что я хочу, но я хотел бы предоставить пользователям простой экран настроек для ввода двух целочисленных значений.

Я в основном использовал учебник, который можно найти здесь, на XDA.

Учебное пособие объясняет, что нужно создать действие, чтобы показать экран настроек и управлять им, хорошо. Но после этого нет никакого объяснения о том, как связать это с Xposed, чтобы пользователь мог щелкнуть имя модуля в списке модуля и получить доступ к экрану настроек, вместо этого я просто получаю сообщение "модуль не предоставляет пользовательский интерфейс". ".

Я не нашел никакой документации о том, как это сделать. Может кто-нибудь просветить меня об этом, пожалуйста?

1 ответ

Я думаю, что нашел виновника (по крайней мере, это решило проблему для меня). Кажется, Xposed автоматически определяет, имеет ли приложение запускаемую активность, и просто запускает его. Там нет API. Источник: Xposed исходный код:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    String packageName = (String) v.getTag();
    if (packageName == null)
        return;

    if (packageName.equals(NOT_ACTIVE_NOTE_TAG)) {
        Intent intent = new Intent(getActivity(), XposedInstallerActivity.class);
        intent.putExtra(XposedInstallerActivity.EXTRA_SECTION, XposedDropdownNavActivity.TAB_INSTALL);
        startActivity(intent);
        return;
    }

    Intent launchIntent = getSettingsIntent(packageName);
    if (launchIntent != null)
        startActivity(launchIntent);
    else
        Toast.makeText(getActivity(), getActivity().getString(R.string.module_no_ui), Toast.LENGTH_LONG).show();
}

Таким образом, вам просто нужно создать действие, но я думаю, что этого недостаточно: вы также должны сделать это "Launcher Activity" в Eclipse, или вы можете сделать это вручную, добавив CATEGORY_LAUNCHER фильтр намерений.

Если это работает, когда вы отправляете приложение из Eclipse на тестовый телефон, оно открывается автоматически (как и любое другое приложение). Если это происходит, обычно приложение также должно открываться внутри Xposed.

Вот, например, что я положил в своем классе:

package xxx.xxx.xxx;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class MainSettingsActivity extends PreferenceActivity {

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // Setup a non-default and world readable shared preferences, so that 1- we know the name (necessary for XSharedPreferences()), 2- the preferences are accessible from inside the hook.
       PreferenceManager prefMgr = getPreferenceManager();
       prefMgr.setSharedPreferencesName("pref_mine");
       prefMgr.setSharedPreferencesMode(MODE_WORLD_READABLE);
       addPreferencesFromResource(R.xml.pref_settings);
    }

}

Затем, чтобы использовать префы внутри вашего хука в вашем основном классе:

public class Main implements IXposedHookLoadPackage {
    public XSharedPreferences pref;

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        XSharedPreferences pref = new XSharedPreferences(Main.class.getPackage().getName(), "pref_mine"); // load the preferences using Xposed (necessary to be accessible from inside the hook, SharedPreferences() won't work)
        pref.makeWorldReadable();
        pref.reload();
        pref.getString("some_var", "default_value");
        ...
Другие вопросы по тегам