synchronized void dumpCursor(final Cursor cursor) {		// Synchronized to avoid interleaving by parallel dumping.
			final int position = cursor.getPosition();
			final String[] columns = cursor.getColumnNames();
			if (! cursor.moveToFirst()) {
				Log.d(TAG, "Empty cursor: " + Arrays.deepToString(columns));
				return;
			}
			Log.d(TAG, "===== CURSOR DUMP =====");
			do {
				for (int i = 0; i < columns.length; i ++) {
					final String column = cursor.getColumnName(i);
					switch (cursor.getType(i)) {
					case FIELD_TYPE_STRING: Log.d(TAG, column + ": " + cursor.getString(i)); break;
					case FIELD_TYPE_INTEGER: Log.d(TAG, column + ": " + cursor.getInt(i) + " (0x" + Integer.toHexString(cursor.getInt(i)) + ")"); break;
					case FIELD_TYPE_FLOAT: Log.d(TAG, column + ": " + cursor.getFloat(i)); break;
					case FIELD_TYPE_NULL: Log.d(TAG, column + ": null"); break;
					case FIELD_TYPE_BLOB: Log.d(TAG, column + ": blob, size=" + cursor.getBlob(i).length); break;
					}
				}
				Log.d(TAG, "=======================");
			} while (cursor.moveToNext());
			cursor.moveToPosition(position);
		}
Documents provider for accessing files in / outside Island.

Created by Oasis on 2017/8/29.
fileprovider/src/main/java/com/oasisfeng/island/fileprovider/ExternalStorageProviderProxy.java