1. 介绍
应用程序中有时需要调用其它软件,但有时用户没有安装需要调用的软件,为方便用户使用,以下例程实现了半自动化的引导用户安装。
1) 调用的几种可能性
a) 被调用的软件包已经存在
b) 用户设备存在应用市场程序(如google market, 掌上应用汇等)
c) 软件安装是否成功(在市场中能否找到软件包,调用市场软件时发生异常)
2. 例程
1) 功能
判断文件管理器是否存在,如果不存在,则引导用户从应用市场安装
2) 关键字
应用中,安装,其它软件,apk
3) 可从此处下载可独立运行的代码
http://download.csdn.net/detail/xieyan0811/4117459
4) 核心代码及说明
package com.demo.apk;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.net.Uri;
import android.util.Log;
import android.content.pm.PackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.content.DialogInterface;
import java.util.List;
import java.util.ArrayList;
public class MyApkActivity extends Activity {
private String TAG ="demo";
private static finalString APK_NAME = "lysesoft.andexplorer";
private static finalint REQUEST_INSTALL = 1;
@Override
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button= new Button(this);
button.setText("test" + APK_NAME);
button.setOnClickListener(newView.OnClickListener() {
publicvoid onClick(View v) {
if(apkExists()) // 软件包中否存在
showExists(); // 提示用户已存在
elseif (!hasMarket()) // 是否有手机市场软件
showWithoutMarket(); // 提示用户无手机市场可用
else
runInstall(); // 安装软件
}
});
setContentView(button);
}
private booleanapkExists() {
PackageManagerpManager = getPackageManager();
List<PackageInfo>packageInfoList = pManager.getInstalledPackages(0);
for (int i =0; i < packageInfoList.size(); i++) {
PackageInfopkg = packageInfoList.get(i);
Log.d(TAG,"pkg name " + pkg.packageName);
if(pkg.packageName.equals(APK_NAME))
returntrue;
}
return false;
}
public booleanhasMarket() {
List<ResolveInfo>mApps = new ArrayList<ResolveInfo>();
Uri uri =Uri.parse("market://search?q=pname:" + APK_NAME);
Intent intent= new Intent(Intent.ACTION_VIEW, uri);
PackageManagerpManager = getPackageManager();
mApps =pManager.queryIntentActivities(intent,
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Log.d(TAG,"market count " + mApps.size());
if(mApps.size() > 0)
returntrue;
else
returnfalse;
}
private voidshowWithoutMarket() {
AlertDialog.Builderdialog = new AlertDialog.Builder(this);
dialog.setMessage("withoutmarket on smartphone");
dialog.setNegativeButton(android.R.string.cancel,null);
dialog.show();
}
private voidshowExists() {
AlertDialog.Builderdialog = new AlertDialog.Builder(this);
dialog.setMessage("apkalready exists");
dialog.setNegativeButton(android.R.string.cancel,null);
dialog.show();
}
private voidrunInstall() {
Uri uri = Uri.parse("market://search?q=pname:"+ APK_NAME);
Intent it =new Intent(Intent.ACTION_VIEW, uri);
startActivityForResult(it,REQUEST_INSTALL);
}
protected voidonActivityResult(int requestCode, int resultCode,
Intentintent) { // 提示用户如果在市场上找不到软件的解决方法
if(requestCode == REQUEST_INSTALL) {
Log.d(TAG,"resultCode " + resultCode);
Toast.makeText(MyApkActivity.this,
"ifapk can't found in market, please download by PC",
Toast.LENGTH_LONG).show();
}
}
};
(转载请注明出处)