Вызов действия стороннего приложения из собственного приложения

Я успешно вызывал сторонние приложения из своего приложения

Такие приложения, как: Google Диск и Google Фото

Код:

btnL1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
     openApp(KioskActivity.this, "com.google.android.apps.docs");
   }
});

btnL2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
     openApp(KioskActivity.this, "com.google.android.apps.photos");
    }
});


public static boolean openApp(Context context, String packageName) {
        PackageManager manager = context.getPackageManager();
        try {
            Intent i = manager.getLaunchIntentForPackage(packageName);
            if (i == null) {
                return false;
                //throw new PackageManager.NameNotFoundException();
            }
            i.addCategory(Intent.CATEGORY_LAUNCHER);
            context.startActivity(i);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

ОБНОВЛЕНИЕ № 1 Вот код, который я использовал для вызова активности стороннего приложения из собственного приложения.

При нажатии кнопки вызывается активность стороннего приложения (например, Last FM)

final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");                
intentDeviceTest.setComponent(new ComponentName("fm.last.android","fm.last.android.LastFm"));
startActivity(intentDeviceTest);

Но всегда получаю android.content.ActivityNotFoundException: Unable to find explicit activity class {fm.last.android/fm.last.android.LastFm}; have you declared this activity in your AndroidManifest.xml? And If I use try-catch blog or if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }, чтобы избежать исключения ANF, тогда оно не показывает исключение, но все еще не может вызвать действие

Я уже установил приложение Last FM на свое устройство, в чем может быть причина?

ОБНОВЛЕНИЕ # 2: я создал приложение Hello World и успешно его вызвал

Скриншоты

Screenshot 1 (только что включил режим киоска)

введите здесь описание изображения

Screenshot 2 (только что вызвал приложение Hello World и нажал, чтобы выйти из Hello World)

введите здесь описание изображения

Вопрос: почему отображается панель навигации и нижняя панель (я имею в виду клавиши «Назад», «Домой» и «Недавние»)

Вот мой updated code:

  public class KioskActivity extends Activity {        

    final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().getDecorView().setSystemUiVisibility(flags);

        getActionBar().hide();

        setContentView(wenchao.kiosk.R.layout.activity_lock_activity);

        DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

        ComponentName mDPM = new ComponentName(this, MyAdmin.class);

        if (myDevicePolicyManager.isDeviceOwnerApp(this.getPackageName())) {

            String[] packages = {this.getPackageName()};
            startLockTask();
        } else {
            Toast.makeText(getApplicationContext(),"Not owner", Toast.LENGTH_LONG).show();
        }

        setVolumMax();

        Button lock_btn = (Button)findViewById(wenchao.kiosk.R.id.lock_button);
        Button unlock_btn = (Button)findViewById(wenchao.kiosk.R.id.unlock_button);
        Button appButton = (Button) findViewById(R.id.appButton);

        lock_btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                startLockTask();
                return false;
            }
        });

        unlock_btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                stopLockTask();
                return false;
            }
        });

        appButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");
                intentDeviceTest.setComponent(new ComponentName("com.example.hello1","com.example.hello1.MainActivity"));
                startActivity(intentDeviceTest);
            }
        });
    }

person Sonali    schedule 16.03.2016    source источник
comment
Само слово киоск описывает, что устройство запускает только одно приложение. Это мешает другим и удалить себя.   -  person Shree Krishna    schedule 16.03.2016
comment
@ShreeKrishna, во-первых, красивое имя, во-вторых, я только что установил этот apk, но мое устройство не в режиме киоска, так как я могу удалить этот apk...   -  person Sonali    schedule 16.03.2016
comment
@Sonali, если он не в режиме киоска, вы можете легко удалить его.   -  person Amy    schedule 16.03.2016
comment
Я пробовал много раз, но не смог удалить этот apk, всегда получая диалоговое окно, в котором отображается отмена как включенная и ОК как отключенная @Amy   -  person Sonali    schedule 16.03.2016
comment
Зайдите в настройки-›приложение-›киоск-приложение-›принудительная остановка   -  person Amy    schedule 16.03.2016
comment
@ Эми, оставьте это, могу я узнать, почему я не могу вызывать сторонние приложения, когда использую приложение в режиме киоска!   -  person Sonali    schedule 16.03.2016


Ответы (1)


Режим киоска официально называется блокировкой задач. Имя содержит подсказку. Вы можете запускать сторонние действия, только если их режим запуска позволяет запускать их в одну и ту же задачу. Если их нет, ваши варианты:

  • отключить блокировку задач перед запуском сторонней активности
  • ходатайствовать перед сопровождающим сторонней активности об изменении ее режима запуска
  • найти альтернативную стороннюю деятельность
person Kevin Krumwiede    schedule 16.03.2016
comment
Я понял вашу точку зрения, я могу вызвать активность приложения, чтобы запустить ее в своем приложении, поэтому я последовал этому: stackoverflow.com/a/3518476 SO Post для вызова активности стороннего приложения, но получая: android.content.ActivityNotFoundException: невозможно найти явный класс активности {fm.last.android/fm.last.android.LastFm}; Вы объявили эту активность в своем AndroidManifest.xml? - person Sonali; 16.03.2016
comment
Я был оригинальным автором ответа, на который вы ссылались. У вас установлен LastFM? Может быть, имя пакета приложения изменилось? Вы проверили манифест или версию приложения LastFm, чтобы убедиться, что вызываете правильное действие? Если это все еще приложение, которое у них есть на Github, оно все равно должно быть действительным. github.com/lastfm/lastfm-android/blob/master/ приложение/ - person Mathias Conradt; 16.03.2016