Как вызвать приложение для Android, которое запускается поверх всех приложений, не вмешиваясь ни в одно сенсорное событие \ нажатие клавиши - PullRequest
0 голосов
/ 02 апреля 2012

Я хочу изменить существующее демо-приложение Android 3D-куб Rubik, который использует GLSurfaceView, и при запуске куб Rubik должен выполнять рендеринг полупрозрачным способом.Кубик Рубика не должен реагировать на какое-либо событие касания, и все события касания должны передаваться в основное приложение.Пока трехмерный кубик Рубика рендерится на экране, я должен иметь возможность использовать устройство обычным способом.

До сих пор я мог запускать куб Рубика поверх главного меню, но это не так.t разрешить любое сенсорное событие, чтобы пройти к базовым приложениям.Также выход 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 ]

1 голос
/ 05 апреля 2012

Наконец-то разобрался, как заставить это работать. Каким-то образом это работает для меня. 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);

Надеюсь, это сработает и для вас, ребята. Комментарии приветствуются. Если у вас есть какие-либо приложения с трюком, опубликуйте их. Будет весело !!

1 голос
/ 02 апреля 2012

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

Вы можете сделать что-то подобное с живыми обоями,

http://developer.android.com/resources/articles/live-wallpapers.html

, но это работает только задомашний экран, не все приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...