【问题标题】:Call third party app Activity from own App从自己的应用程序调用第三方应用程序活动
【发布时间】:2016-07-01 19:29:54
【问题描述】:

我已成功从我的应用调用第三方应用

类似应用:Google Drive 和 Google Photos

代码:

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;
        }
    }

UPDATE #1这是我跟随的Code从自己的应用程序调用第三方应用程序活动

点击按钮调用第三方应用的Activity(如: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 应用程序,那可能是什么原因?

UPDATE #2:我创建了 Hello World 应用并成功调用了该应用

截图

Screenshot 1(刚刚启用 Kiosk 模式)

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);
            }
        });
    }

【问题讨论】:

  • Kiosk 一词本身描述了该设备仅运行单个应用程序。它会阻止其他人并自行卸载..
  • @ShreeKrishna 首先是好名字,其次我刚刚安装了那个 apk,但是我的设备没有处于 kiosk 模式,所以我该如何卸载那个 apk...
  • @Sonali 如果不在 kiosk 模式下,您可以轻松卸载它
  • 我已经尝试了很多次,但无法卸载该 apk,总是出现对话框,其中显示取消已启用并且可以禁用@Amy
  • 进入设置->app->kiosk app->强制停止

标签: android android-5.0-lollipop kiosk-mode android-5.1.1-lollipop


【解决方案1】:

Kiosk 模式正式称为任务锁定。该名称包含一个线索。如果第三方活动的launch mode 允许它们被启动到相同的任务,您只能启动它们。如果他们不这样做,您的选择是:

  • 在启动第三方活动之前禁用任务锁定
  • 请愿第三方活动的维护者更改其启动模式
  • 寻找替代的第三方活动

【讨论】:

  • 我明白了你的意思,我可以调用应用程序活动来在我的应用程序中运行它,所以我遵循了这个:stackoverflow.com/a/3518476 SO Post 调用第三方应用程序活动,但得到:android.content.ActivityNotFoundException : 找不到明确的活动类 {fm.last.android/fm.last.android.LastFm};您是否在 AndroidManifest.xml 中声明了此活动?
  • 我是您链接到的答案的原始发布者。你有安装 LastFM 吗?也许应用程序的包名称已更改?您是否检查了清单或 LastFm 应用程序版本,以确保您调用了正确的活动?如果它仍然是他们在 Github 上的应用程序,它应该仍然有效。 github.com/lastfm/lastfm-android/blob/master/app/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多