2014-10-17 66 views
1

我在那个下发展这样的应用程序,的Android推出的应用程序时,点击perticular应用程序图标

活动显示所有使用的GridView他们的名字,如下面的方法安装的应用程序:

private ArrayList<ImageItem> getData() { 

    final PackageManager pm = getPackageManager(); 

    List<ApplicationInfo> packages = pm 
      .getInstalledApplications(PackageManager.GET_META_DATA); 


    final ArrayList<ImageItem> imageItems = new ArrayList<ImageItem>(); 

    for (ApplicationInfo packageInfo : packages) 

    { 
     if (pm.getLaunchIntentForPackage(packageInfo.packageName) != null && 

     !pm.getLaunchIntentForPackage(packageInfo.packageName).equals("")) 

     { 

      try { 
       System.out.println("Application Label :" 
         + pm.getApplicationIcon(packageInfo.packageName) 
           .toString()); 

       Drawable bitmap = pm 
         .getApplicationIcon(packageInfo.packageName); 
       imageItems.add(new ImageItem(bitmap, (String) pm 
         .getApplicationLabel(packageInfo))); 
      } catch (NameNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 
    return imageItems; 

} 

它diplsay所有已安装的应用程序以及自定义的GridView,但我想当我点击像点击facebook这样的perticular gridview应用程序图标时, - >启动该应用程序,

如何获取onItemClick中的特定包发射器gridview o启动特定应用程序?

怎么去启动应用程序特定的应用程序包的名称或如何如何在GridView控件做的就是采取具体应用laucher包名的应用程序:

gridView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // TODO Auto-generated method stub 
      Toast.makeText(GridCameraPreviewTestActivity.this, 
        position + "Selected", Toast.LENGTH_SHORT).show(); 

     } 
    }); 

回答

1

完整代码列表上的GridView和所有已安装应用程序启动perticular上onItemClick:

public class MainActivity extends Activity implements OnItemClickListener { 

private GridView gridview; 
private List<ApplicationInfo> applist = null; 
private PackageManager packageManager = null; 
private ApplicationAdapter listadaptor = null; 

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

    setContentView(R.layout.activity_main); 
    gridview = (GridView) findViewById(R.id.grid_view); 
    packageManager = getPackageManager(); 
    new LoadApplications().execute(); 
} 

private class LoadApplications extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA)); 
     Log.d("list size", String.valueOf(applist.size())); 
     listadaptor = new ApplicationAdapter(MainActivity.this, R.layout.list_item, applist); 
     System.out.println("adapter="+listadaptor); 
     return null; 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     gridview.setAdapter(listadaptor); 
     gridview.setOnItemClickListener(MainActivity.this); 

     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // TODO Auto-generated method stub 
    ApplicationInfo app = applist.get(position); 
    try { 

     Intent intent = packageManager.getLaunchIntentForPackage(app.packageName); 

     if (null != intent) { 
      startActivity(intent); 
     } 
    } catch (ActivityNotFoundException e) { 
     Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } catch (Exception e) { 
     Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 

private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) { 
    ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>(); 
    for (ApplicationInfo info : list) { 
     try { 
      if (null != packageManager.getLaunchIntentForPackage(info.packageName)) { 
       applist.add(info); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return applist; 
    } 
} 

ApplicationAdapter:

public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo> { 
private List<ApplicationInfo> appsList = null; 
private Context context; 
private PackageManager packageManager; 

public ApplicationAdapter(Context context, int textViewResourceId, 
     List<ApplicationInfo> appsList) { 
    super(context, textViewResourceId, appsList); 
    this.context = context; 
    this.appsList = appsList; 
    packageManager = context.getPackageManager(); 
} 

@Override 
public int getCount() { 
    return ((null != appsList) ? appsList.size() : 0); 
} 

@Override 
public ApplicationInfo getItem(int position) { 
    return ((null != appsList) ? appsList.get(position) : null); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (null == view) { 
     LayoutInflater layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = layoutInflater.inflate(R.layout.list_item, null); 
    } 

    ApplicationInfo data = appsList.get(position); 
    if (null != data) { 
     TextView appName = (TextView) view.findViewById(R.id.title); 
     //TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
     ImageView iconview = (ImageView) view.findViewById(R.id.icon); 

     appName.setText(data.loadLabel(packageManager)); 
     //packageName.setText(data.packageName); 
     iconview.setImageDrawable(data.loadIcon(packageManager)); 
    } 
    return view; 
    } 
} 

activity_main.xml中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <GridView 
     android:id="@+id/grid_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:columnWidth="90dp" 
     android:gravity="center" 
     android:horizontalSpacing="10dp" 
     android:numColumns="auto_fit" 
     android:stretchMode="columnWidth" 
     android:verticalSpacing="10dp" /> 

</RelativeLayout> 

充气xml文件: list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="5dp" 
     android:orientation="vertical" 
     android:padding="5dp" > 

     <ImageView 
      android:id="@+id/icon" 
      android:layout_width="30dp" 
      android:layout_height="30dp" > 
     </ImageView> 

     <TextView 
      android:id="@+id/title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="5dp" 
      android:gravity="left" 
      android:textColor="@android:color/white" 
      android:textSize="12sp" > 
     </TextView> 

</LinearLayout> 

其成功运行的完整代码。希望这些对他人有帮助。

0

就这么简单:

Intent intent= getPackageManager().getLaunchIntentForPackage("com.example.package"); 
startActivity(intent); 
+0

但我点击任何应用程序,所有的应用程序有不同的包名称na? – 2014-10-17 13:34:22

+0

是啊,你必须有一个所有的应用程序的列表,你有选择的位置。所以你可以得到选定的包名称并使用它。 – 2014-10-17 13:36:28

0
所有的

首先得到应用的包名称:

PackageManager pm = getPackageManager(); //get a list of installed apps. List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {

Log.d("TAG", "Installed package :" + packageInfo.packageName);

Log.d("TAG", "Source dir : " + packageInfo.sourceDir);

Log.d("TAG", "Launch Activity:"+pm.getLaunchIntentForPackage(packageInfo.packageName)); }

现在打电话的意图:

Intent intent= getPackageManager().getLaunchIntentForPackage("com.example.package"); startActivity(intent);

您可以管理获取包位置和重定向包在Gridview项目点击。

+0

感谢您的回复,但我已经做到这一点,但我想要什么在gridview onclick – 2014-10-17 13:49:42

+0

请用户BaseAdapter或ArrayAdapter显示您的Gridview数据,那么得到特定的应用程序位置和它的重定向会更容易。请参考:http://theopentutorials.com/tutorials/android/listview/android-custom-listview-with-image-and-text-using-baseadapter/ – 2014-10-18 05:17:03