将“.apk”文件复制到指定的文件夹

时间:2015-12-10 05:47:52

标签: android image file android-listview inputstream

我正在尝试将已安装的app的apk从listview复制到某个指定的文件夹。复制apk正常工作...但每次我点击应用程序复制其apk ...“phone.apk”被复制到带有diff包名称的目标文件夹。 这是文件复制的代码。

              public class MainActivity extends ListActivity {
PackageManager packageManager;
List<ApplicationInfo> applist;
Listadapter listadapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    packageManager = getPackageManager();

    new LoadApplications().execute();

}

@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
    super.onListItemClick(l, v, position, id);

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    dialogBuilder.setTitle("Choose option")
            .setItems(R.array.options, new  DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {

                        case 0:
                            ApplicationInfo app3 = applist.get(position);
                            packageName=app3.packageName;
                            final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
                            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                            final List pkgAppsList = getPackageManager().queryIntentActivities(mainIntent, 0);
                            for (Object object : pkgAppsList) {
                                ResolveInfo info = (ResolveInfo) object;
                                File f1 = new File(info.activityInfo.applicationInfo.publicSourceDir);
                                try{                          
                                    File f2 = new File(Environment.getExternalStorageDirectory().toString()+"/Rahul");
                                    f2.mkdirs();
                                    f2 = new File(f2.getPath()+"/"+packageName + ".apk");
                                    f2.createNewFile();

                                    InputStream in = new FileInputStream(f1);

                                    OutputStream out = new FileOutputStream(f2);

                                    byte[] buf = new byte[1024];
                                    int len;
                                    while ((len = in.read(buf)) > 0){
                                        out.write(buf, 0, len);
                                    }
                                    in.close();
                                    out.close();
                                    Toast.makeText(MainActivity.this,"Copied",Toast.LENGTH_LONG).show();
                                }
                                catch(FileNotFoundException ex){
                                    System.out.println(ex.getMessage() + " in the specified directory.");
                                }
                                catch(IOException e){
                                    System.out.println(e.getMessage());
                                }
                                break;
                            }
                    }
                }
            });
    dialogBuilder.setCancelable(true)
            .show();

}

private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
    ArrayList<ApplicationInfo> applist = new ArrayList<>();

    for (ApplicationInfo info : list) {
        try {
            if (packageManager.getLaunchIntentForPackage(info.packageName) != null) {
                applist.add(info);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return applist;
}

private class LoadApplications extends AsyncTask<Void, Void, Void> {
    private ProgressDialog progress = null;

    @Override
    protected Void doInBackground(Void... params) {
        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));

        listadapter = new Listadapter(MainActivity.this, R.layout.list_item, applist);

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        setListAdapter(listadapter);
        progress.dismiss();
        super.onPostExecute(aVoid);

    }

    @Override
    protected void onPreExecute() {
        progress = ProgressDialog.show(MainActivity.this, null, "loading apps info,,,");
        super.onPreExecute();
    }

}
}

This is the ss of the destination folder in which file gets copied.

1 个答案:

答案 0 :(得分:0)

您可以将已安装的应用程序循环列表作为包列表获取,但您没有比较您的包名称和循环中包含的包的名称。所以最后一个应用程序已保存。请用这个希望它会对你有所帮助。评论部分是添加

public class MainActivity extends ListActivity {
    PackageManager packageManager;
    List<ApplicationInfo> applist;
    Listadapter listadapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        packageManager = getPackageManager();

        new LoadApplications().execute();

    }

    @Override
    protected void onListItemClick(ListView l, View v, final int position,
            long id) {
        super.onListItemClick(l, v, position, id);

        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setTitle("Choose option").setItems(R.array.options,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {

                        case 0:
                            ApplicationInfo app3 = applist.get(position);

                            // this is the pakage name of tha app you clicked
                            packageName = app3.packageName;
                            final Intent mainIntent = new Intent(
                                    Intent.ACTION_MAIN, null);
                            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                            final List pkgAppsList = getPackageManager()
                                    .queryIntentActivities(mainIntent, 0);
                            for (Object object : pkgAppsList) {
                                ResolveInfo info = (ResolveInfo) object;
                                // check whther the app clicked and the app in
                                // the loop has same package name
                                if (info.activityInfo.packageName
                                        .equals(packageName)) {
                                    File f1 = new File(
                                            info.activityInfo.applicationInfo.publicSourceDir);
                                    try {
                                        File f2 = new File(Environment
                                                .getExternalStorageDirectory()
                                                .toString()
                                                + "/Rahul");
                                        f2.mkdirs();
                                        f2 = new File(f2.getPath() + "/"
                                                + packageName + ".apk");
                                        f2.createNewFile();

                                        InputStream in = new FileInputStream(f1);

                                        OutputStream out = new FileOutputStream(
                                                f2);

                                        byte[] buf = new byte[1024];
                                        int len;
                                        while ((len = in.read(buf)) > 0) {
                                            out.write(buf, 0, len);
                                        }
                                        in.close();
                                        out.close();
                                        Toast.makeText(MainActivity.this,
                                                "Copied", Toast.LENGTH_LONG)
                                                .show();
                                    } catch (FileNotFoundException ex) {
                                        System.out.println(ex.getMessage()
                                                + " in the specified directory.");
                                    } catch (IOException e) {
                                        System.out.println(e.getMessage());
                                    }
                                    break;
                                }
                            }
                        }
                    }
                });
        dialogBuilder.setCancelable(true).show();

    }

    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
  ArrayList<ApplicationInfo> applist = new ArrayList<>();

  for (ApplicationInfo info : list) {
      try {
          if (packageManager.getLaunchIntentForPackage(info.packageName) != null) {
              applist.add(info);
          }
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  return applist;
}

    private class LoadApplications extends AsyncTask<Void, Void, Void> {
        private ProgressDialog progress = null;

        @Override
        protected Void doInBackground(Void... params) {
            applist = checkForLaunchIntent(packageManager
                    .getInstalledApplications(PackageManager.GET_META_DATA));

            listadapter = new Listadapter(MainActivity.this,
                    R.layout.list_item, applist);

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            setListAdapter(listadapter);
            progress.dismiss();
            super.onPostExecute(aVoid);

        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(MainActivity.this, null,
                    "loading apps info,,,");
            super.onPreExecute();
        }

    }
}