2015-03-13 160 views
0

我有一个问题,我看到堆栈溢出的几个答案,但无济于事。我试图做的是这样的:从市场安装APK从应用程序内提示安装

我正在做一个应用程序,检查应用程序是否先安装。例如,com.appA.android。

如果未安装appA,它会提示用户提示安装,然后再继续安装应用程序。我没有试图安装未经用户许可的APK,但获得他们的许可。 appA在商店中,但我不希望我的用户被拉离应用程序。目前,我这样做的方式是这样的:

Intent promptInstall = new Intent(Intent.ACTION_VIEW) 
         .setDataAndType(Uri.parse("file:///path/to/apk"), 
       "application/vnd.android.package-archive"); 
       startActivity(promptInstall); 

任何方式,我可以用一个市场环节做到这一点?

感谢您的帮助!

+0

不,你不能从Play下载的APK您自己存储,您必须通过商店的用户界面,无论是在设备上的应用程序或Web界面。 – 2015-03-13 14:41:03

回答

0

尝试类似这样的操作,即可打开特定应用的Google Play详情页面。 (假设这是你想要做什么)

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(Uri.parse("market://details?id=com.example.android")); 
startActivity(intent); 
+0

感谢您的回复。然而,即时通讯试图让我的用户进入应用程序,并与包管理器“安装/市场/取消”提示迎接而不是被拉走。 – DirectXgameR 2015-03-13 14:38:09

+0

AFAIK,你不能直接从市场上在后台安装应用程序,而不显示市场用户界面。您可以尝试以编程方式从市场上下载APK,并将其安装在后台。 – JonasCz 2015-03-13 14:41:17

+0

我会完全确定将文件首先下载到存储,而不是提示安装。什么是最好的方法来做到这一点?谢谢! – DirectXgameR 2015-03-13 14:42:55

1

因为你不能没有安装对话框或背景中安装APK安全原因。您可以使用root和Packagemanager在后台安装APK。

有几次尝试侦听应用程序的安装,因此您可以重新启动您的活动。一个是注册一个BroadcastReceiver,它监听应用程序的安装。

<receiver android:name=".PackageReceiver"> 
<intent-filter> 
    <action android:name="android.intent.action.PACKAGE_ADDED" /> 
    <action android:name="android.intent.action.PACKAGE_CHANGED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:scheme="package" /> 
</intent-filter> 

这个类,然后安装一个新包时被调用:

public class PackageReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
// handle install event here 
} 
} 

第二次尝试是有一个计时器,试图找到该应用程序的安装所有n秒。从另一个问题示例:

public class Example extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     //Put the package name here... 
     boolean installed = appInstalledOrNot("com.Ch.Example.pack"); 
     if(installed) { 
      //This intent will help you to launch if the package is already installed 
      Intent LaunchIntent = getPackageManager() 
       .getLaunchIntentForPackage("com.Ch.Example.pack"); 
      startActivity(LaunchIntent); 

      System.out.println("App already installed on your phone");   
     } 
     else { 
      System.out.println("App is not installed on your phone"); 
     } 
    } 

    private boolean appInstalledOrNot(String uri) { 
     PackageManager pm = getPackageManager(); 
     boolean app_installed = false; 
     try { 
      pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); 
      app_installed = true; 
     } 
     catch (PackageManager.NameNotFoundException e) { 
      app_installed = false; 
     } 
     return app_installed ; 
    } 
} 

最后但并非最不重要的:如果你有APK和根,你可以使用shell命令来安装它:

pm install APKFile.apk 
+0

请更仔细地重新阅读该问题,因为您的帖子没有解决所问的实际问题。 – 2015-03-13 14:39:40

+0

当然,它的确如此。因为它会让用户留在当前活动中,因为当前活动可以侦听安装并恢复它。 – 2015-03-13 14:40:16

+0

不,它没有,因为你忽略了**你无法从游戏商店获得apk文件来与**做到这一点。那么,如果可以的话,不是做什么的方法,而是问题的核心。 – 2015-03-13 14:41:52