Android:无法压缩生成的文件

时间:2018-07-28 04:36:41

标签: android nullpointerexception rx-java2

我正在这个项目中,我从联系人列表中生成了CSV文件,现在应该使用RxJava将所有文件打包为一个zip存档,因此我试图获取方法来创建使用onComplete方法调用的档案。但是应用程序因此错误而崩溃:

Attempt to invoke direct method 'boolean appjoe.wordpress.com.testdemo.Tab2$FileHelper.zip(java.lang.String, java.lang.String)' on a null object reference

这是我的代码:
路径:/storage/emulated/0/Android/data/com.wordpress.appjoe/csv

File location = new File(Environment.getExternalStorageDirectory(), "Android/data/com.wordpress.appjoe/csv/");
File fileLocation;
FileOutputStream dest;
String path;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_tab2, container, false);
    mbutton = v.findViewById(R.id.extractContact);

    mbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                // Permission has already been granted

                Observer observer = new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        mCursor = getCursor();
                        fCursor = getCursor();
                        location.mkdirs();
                        path = location.getAbsolutePath();
                        try {
                            dest = new FileOutputStream(path);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onNext(Object o) {
                        contactData = o.toString();
                        fCursor.moveToPosition(count);
                        fileLocation = new File(path, getName(fCursor)+".csv");
                        try {
                            FileOutputStream fileOut = new FileOutputStream(fileLocation);
                            fileOut.write(contactData.getBytes());
                            fileOut.flush();
                            fileOut.close();

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        mCursor.close();
                        fCursor.close();

                        // Creating archive once the CSV files are generated
                        if (fileHelper.zip(path, location.getParent())) {
                            Toast.makeText(getContext(), "Zip successful", Toast.LENGTH_SHORT).show();
                        }
                        Log.d("fileLocation", "location: " + location.getParent());
                        Log.d("fileLocation", "path: " + path);
                        Log.d("Observer_contact", "Completed");

                    }
                };

                io.reactivex.Observable.create(new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                        try {
                            for (count = 0; count < mCursor.getCount(); count++) {
                                emitter.onNext(loadContacts(count));
                            }
                            emitter.onComplete();
                        } catch (Exception e) {
                            emitter.onError(e);
                        }
                    }
                }).subscribeOn(Schedulers.io())
                        .distinct()
                        .subscribeWith(observer);

            }
        }
    });



    // Inflate the layout for this fragment
    return v;
}

RxJava实现以获取联系人:

public String loadContacts(int i) {
    StringBuilder mBuilder = new StringBuilder();
    ContentResolver mContentResolver = getActivity().getContentResolver();

    mCursor.moveToPosition(i);
    if (mCursor.getCount() > 0 ) {
        String id = getID(mCursor);
        String name = getName(mCursor);
        int hasPhoneNumber = hasNumber(mCursor);

        if (hasPhoneNumber > 0) {
            mBuilder.append("\"").append(name).append("\"");
            Cursor cursor = mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "= ?",
                    new String[]{id}, null);

            assert cursor != null;
            while (cursor.moveToNext()) {
                String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                        .replaceAll("\\s", "");

                // if number is not existing in the list, then add number to the string
                if (!(mBuilder.toString().contains(phoneNumber))) {
                    mBuilder.append(", ").append(phoneNumber);
                }
            }

            cursor.close();
        }
    }
    return mBuilder.toString();
}

获取必要信息的方法:

private Cursor getCursor() {
    ContentResolver mContentResolver = getActivity().getContentResolver();
    return mContentResolver.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");
}

private String getID(Cursor cursor) {
    String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    return id;
}

private String getName(Cursor cursor) {
    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    return name;
}

private int hasNumber(Cursor cursor) {
    return Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
}

生成存档的类

// Custom class to help with zipping of generated CSVs
private class FileHelper {
    private static final int BUFFER_SIZE = 2048;
    private String TAG = FileHelper.class.getName();
    private String parentPath = "";
    private String destinationFileName = "Contacts_CSV.zip";

    private boolean zip (String sourcePath, String destinationPath) {
        new File(destinationPath).mkdirs();
        FileOutputStream fileOutputStream;
        ZipOutputStream zipOutputStream = null;

        try {
            if (!destinationPath.endsWith("/")) {
                destinationPath = destinationPath + "/";
            }
            String destination = destinationPath + destinationFileName;
            File file = new File(destination);
            if (!file.exists()) {
                file.createNewFile();
            }

            fileOutputStream = new FileOutputStream(file);
            zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream));

            parentPath = new File(sourcePath).getParent() + "/";

            zipFile(zipOutputStream, sourcePath);

        } catch (IOException e) {
            e.printStackTrace();
            Log.d(TAG,e.getMessage());
            return false;
        } finally {
            if (zipOutputStream!=null)
                try {
                    zipOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

        return true;
    }

    private void zipFile (ZipOutputStream zipOutputStream, String sourcePath) throws IOException {
        java.io.File files = new java.io.File(sourcePath);
        java.io.File[] fileList = files.listFiles();

        String entryPath="";
        BufferedInputStream input;
        for (java.io.File file : fileList) {
            if (file.isDirectory()) {

            } else {
                byte data[] = new byte[BUFFER_SIZE];
                FileInputStream fileInputStream = new FileInputStream(file.getPath());
                input = new BufferedInputStream(fileInputStream, BUFFER_SIZE);
                entryPath = file.getAbsolutePath().replace(parentPath, "");

                ZipEntry entry = new ZipEntry(entryPath);
                zipOutputStream.putNextEntry(entry);

                int count;
                while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
                    zipOutputStream.write(data, 0, count);
                }
                input.close();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我通过删除类FileHelper并将FileHelper内部的两个方法都设置为主类的私有方法来解决了这个问题。这样,从onComplete()调用方法不会导致程序崩溃,并且可以成功生成zip文件。