Как вызвать приложение для Android, которое запускается поверх всех приложений, не вмешиваясь ни в одно сенсорное событие \ нажатие клавиши
Я хочу изменить существующее демо-приложение Android 3D-куб Rubik, который использует GLSurfaceView, и при запуске куб Rubik должен выполнять рендеринг полупрозрачным способом. Кубик Рубика не должен отвечать на какое-либо событие касания, и все события касания должны передаваться в основное приложение. Пока 3D-куб Рубика рендерится на экране, я должен иметь возможность использовать устройство обычным способом.
До сих пор я мог запускать кубик Рубика в верхней части главного меню, но он не позволяет любому событию касания проходить к базовым приложениям. Также выход 3D-куба по нажатию клавиши назад (не желаемый результат, который я хочу). Я использую Android 4.0.3.
public class KubeService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("KubeService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onCreate() {
super.onCreate();
Intent intent1 = new Intent();
intent1.setComponent(new ComponentName("com.abc.appname","com.abc.appname.kube.Kube"));
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent1);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
Я надеюсь, что все понимают, каково мое намерение. Проще говоря, я хочу запустить 3D-приложение таким образом, чтобы оно отображалось поверх каждого приложения только полупрозрачным образом, в то же время пользователь должен иметь возможность использовать свое устройство в нормальный способ.
Я думаю, что это достижимо, поскольку я видел одно стороннее приложение для 3D-графики, которое работает абсолютно так, как я описал. После запуска приложение просто запускается поверх пользовательского интерфейса и не вмешивается в взаимодействие с пользователем. Нет настройки ОС, без изменений в любой другой код приложения.
2 ответа
Наконец-то разобрался, как заставить это работать. Каким-то образом это работает для меня. 3D кубик Рубика отлично работает везде:) . ОК.. Давайте перейдем к делу...
Большинство изменений, которые я сделал, находятся в файле "Kube.java". Класс Original Kube, используемый для расширения активности. Теперь это фактически расширяет сервис. Теперь это KubeService. Для этого нам нужно предоставить body для двух функций onBind() и onDistroy().
public IBinder onBind(Intent intent)
{
return null;
}
public void onDestroy()
{
super.onDestroy();
if (mView != null)
{
((WindowManager)getSystemService("window")).removeView(mView);
mView = null;
}
Log.v(TAG, "service stopped.");
}
Откуда появилось окно? Где мы добавили наш вид в окно? Теперь это весь трюк заставить его работать..
Нам нужно переписать метод onCreate(). Вот метод onCreate(), который работал для меня.
public void onCreate()
{
Log.v(TAG, "onCreate");
super.onCreate();
GLWorld myGLWorld = makeGLWorld();
mView = new GLSurfaceView(this);
mRenderer = new KubeRenderer(myGLWorld, this);
mView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mView.setRenderer(this.mRenderer);
mView.getHolder().setFormat(PixelFormat.TRANSLUCENT); //many alpha bits
//mView.getHolder().setFormat(PixelFormat.TRANSPARENT); // at least 1 alpha bit
//mView.getHolder().setFormat(PixelFormat.RGBA_8888);
WindowManager localWM = (WindowManager)getBaseContext().getSystemService("window");
WindowManager.LayoutParams localLP = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
localLP.setTitle("KubeService");
localWM.addView(mView, localLP);
Log.v(TAG, "service started.");
}
Помимо этих изменений, не забудьте добавить разрешение SYSTEM_ALERT_WINDOW и службу kube.KubeService, как показано ниже в файле манифеста.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<service android:enabled="true"
android:name=".kube.KubeService">
</service>
Теперь все настроено, и нам просто нужно создать намерение для KubeService и запустить сервис.
Intent kubeIntent = new Intent().setClassName("PACKAGE_NAME", "PACKAGE_NAME.kube.KubeService");
А также
startService(kubeIntent);
Я надеюсь, что это сработает и для вас, ребята. Комментарии приветствуются. Если вы придумали какие-либо приложения с хитростью, опубликуйте их. Это будет весело!!
Это невозможно с приложением для Android. активность на переднем плане будет захватывать пользовательский ввод. вам придется изменить ОС на очень низком уровне для достижения. Я понятия не имею, как поступить, если честно.
Вы можете сделать что-то подобное с живыми обоями,
http://developer.android.com/resources/articles/live-wallpapers.html
но это работает только за домашним экраном, а не всеми приложениями.