public Uri copy(final Uri source, final Folder target, @Nullable final FileNameCreator newName, final boolean move) {
        boolean success = true;
        Exception failureEx = null;

        InputStream in = null;
        OutputStream out = null;
        Uri outputUri = null;
        try {
            FileNameCreator fnc = newName;
            if (fnc == null) {
                String displayName = getName(source);
                if (displayName == null) {
                    displayName = UriUtils.getLastPathSegment(source);
                }
                fnc = FileNameCreator.forName(displayName);
            }
            outputUri = create(target, fnc, false);
            if (outputUri == null) {
                success = false;
                return null;
            }
            in = openForRead(source);
            out = openForWrite(outputUri);
            if (in == null || out == null) {
                success = false;
                return null;
            }
            IOUtils.copy(in, out);
        } catch (Exception ie) {
            success = false;
            failureEx = ie;
            delete(outputUri);
            return null;
        } finally {
            closeQuietly(in, out);
            if (!success) {
                reportProblem(R.string.contentstorage_err_copy_failed, failureEx, false, source, target, move);
            }
        }
        return outputUri;
    }
Opens an Uri for reading. Remember to close stream after usage! Returns null if Uri can't be opened for reading.

@param suppressWarningForUser if true then failure to open will NOT result in a toast to user
main/src/main/java/cgeo/geocaching/storage/ContentStorage.java