大家好我,获取完应用的相关数据后,把数据显示在listview上,点击想进入相应的应用但是,每次都进不去,不知道为什么,大家给些意见,代码如下package com.mainroadlee.appdisplayer;import java.util.ArrayList;
import java.util.List;
import com.mainroadlee.appdisplayer.R;import dalvik.system.TemporaryDirectory;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;public class Main extends Activity {
private static final String TAG = "Main";
// Use ArrayList to store the installed non-system apps
ArrayList<AppInfo> appList = new ArrayList<AppInfo>();
private Button button; // ListView app_listView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.testApps);
button.setOnClickListener(new ButtonClickListener());
List<PackageInfo> packages = getPackageManager()
.getInstalledPackages(0); for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
AppInfo tmpInfo = new AppInfo();
tmpInfo.appName = packageInfo.applicationInfo.loadLabel(
getPackageManager()).toString();
tmpInfo.packageName = packageInfo.packageName;
tmpInfo.versionName = packageInfo.versionName;
tmpInfo.versionCode = packageInfo.versionCode;
tmpInfo.appIcon = packageInfo.applicationInfo
.loadIcon(getPackageManager());
appList.add(tmpInfo); }
for (int i = 0; i < appList.size(); i++) {
appList.get(i).print();
} // Populate data to listView
ListView app_listView = (ListView) findViewById(R.id.listview);
AppAdapter appAdapter = new AppAdapter(Main.this, appList); // app_listView.setAdapter(appAdapter);
app_listView.setDividerHeight(5);
app_listView.setOnItemClickListener(new ListViewOnItemClickListener());
if (app_listView != null) {
app_listView.setAdapter(appAdapter);
}
} /**
 * 
 * @author shihx
 * 
 */
public class ListViewOnItemClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> av, View v, int position,
long arg3) {
// TODO Auto-generated method stub
AppInfo tmpInfo = appList.get(position);
Intent intent = new Intent();
Toast.makeText(Main.this, tmpInfo.getPackageName()+"."+tmpInfo.getAppName(), 1).show();
intent.setClassName(tmpInfo.getPackageName(),tmpInfo.getPackageName()+"."+tmpInfo.getAppName());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivitySafely(intent);
}
} void startActivitySafely(Intent intent) {
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.activity_not_found,
Toast.LENGTH_SHORT).show();
} catch (SecurityException e) {
Toast.makeText(this, R.string.activity_not_found,
Toast.LENGTH_SHORT).show();
Log.i(TAG,
"Showbook does not have the permission to launch "
+ intent
+ ". Make sure to create a MAIN intent-filter for the corresponding activity "
+ "or use the exported attribute for this activity.",
e);
}
} public class ButtonClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(Main.this, AppsShowActivity.class);
startActivity(intent);
} } public class AppAdapter extends BaseAdapter { Context context;
ArrayList<AppInfo> dataList = new ArrayList<AppInfo>(); public AppAdapter(Context context, ArrayList<AppInfo> inputDataList) {
this.context = context;
dataList.clear();
for (int i = 0; i < inputDataList.size(); i++) {
dataList.add(inputDataList.get(i));
}
} @Override
public int getCount() {
// TODO Auto-generated method stub
return dataList.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return dataList.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { View v = convertView;
final AppInfo appUnit = dataList.get(position);
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.app_row, null);
v.setClickable(true);
}
TextView appName = (TextView) v.findViewById(R.id.appName);
ImageView appIcon = (ImageView) v.findViewById(R.id.icon);
if (appName != null)
appName.setText(appUnit.appName);
if (appIcon != null)
appIcon.setImageDrawable(appUnit.appIcon);
return v;
}
}
}

解决方案 »

  1.   

    我想问题可能出在你的AppInfo 这个类的getAppName()上;
    intent.setClassName 这个方法的参数是一定的
    你可以把你传进去的值打印以下 比较有什么区别 ,再搜搜实际应该怎么启动那个应用
    比如你点击一个UC 浏览器试试 看看你实际传入的值是什么。还有网上资料上应该怎么样调用
    2、启动其他浏览器(当然该浏览器必须安装在机器上)
      只要修改以下相应的packagename 和 主启动activity即可调用其他浏览器  intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");  uc浏览器":"com.uc.browser", "com.uc.browser.ActivityUpdate“
      opera:"com.opera.mini.android", "com.opera.mini.android.Browser"
      qq浏览器:"com.tencent.mtt", "com.tencent.mtt.MainActivity"出错 还是先打印日志看看
      

  2.   

    csdn咋现在人气这么差啊,高手呢?
      

  3.   

    你这段启动代码是不是从Launcher里拿出来的?里边的某些参数应用层程序读出来有些问题,可以在知道程序包名的情况下使用如下方式启动:Intent intent = context.getPackageManager().getLaunchIntentForPackage("packagename");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);