파일 정보 가져오기

클라이언트 앱이 콘텐츠 URI가 있는 파일로 작업하려고 하기 전에 앱은 서버 앱에 파일의 데이터 유형 및 파일 크기 등 파일에 관한 정보를 요청할 수 있습니다. 데이터 유형은 클라이언트 앱이 파일을 처리할 수 있는지 확인하는 데 도움이 되고, 파일 크기는 클라이언트 앱이 파일의 버퍼링과 캐싱을 설정하는 데 도움이 됩니다.

이 과정에서는 서버 앱의 FileProvider을 쿼리하여 파일의 MIME 유형 및 크기를 가져오는 방법을 보여줍니다.

파일의 MIME 유형 가져오기

파일의 데이터 유형은 파일의 콘텐츠를 어떻게 처리해야 하는지 클라이언트 앱에 보여줍니다. 콘텐츠 URI가 지정된 공유 파일의 데이터 유형을 가져오기 위해 클라이언트 앱은 ContentResolver.getType()를 호출합니다. 이 메서드는 파일의 MIME 유형을 반환합니다. 기본적으로 FileProvider는 파일 이름 확장자에서 파일의 MIME 유형을 확인합니다.

다음 코드 스니펫은 서버 앱이 콘텐츠 URI를 클라이언트에 반환한 후 클라이언트 앱이 파일의 MIME 유형을 가져오는 방법을 보여줍니다.

Kotlin

    ...
    /*
     * Get the file's content URI from the incoming Intent, then
     * get the file's MIME type
     */
    val mimeType: String? = returnIntent.data?.let { returnUri ->
        contentResolver.getType(returnUri)
    }
    ...

Java

    ...
    /*
     * Get the file's content URI from the incoming Intent, then
     * get the file's MIME type
     */
    Uri returnUri = returnIntent.getData();
    String mimeType = getContentResolver().getType(returnUri);
    ...

파일 이름 및 크기 가져오기

FileProvider 클래스에는 Cursor의 콘텐츠 URI와 연결된 파일의 이름과 크기를 반환하는 query() 메서드의 기본 구현이 있습니다. 기본 구현에서는 다음과 같은 두 개의 열을 반환합니다.

DISPLAY_NAME
String 형식의 파일 이름입니다. 이 값은 File.getName()에서 반환된 값과 동일합니다.
SIZE
long 형식의 파일 크기(바이트)입니다. 이 값은 File.length()에서 반환된 값과 동일합니다.

클라이언트 앱은 콘텐츠 URI를 제외하고 query()의 모든 인수를 null로 설정하여 파일의 DISPLAY_NAMESIZE를 모두 가져올 수 있습니다. 예를 들어 다음 코드 스니펫은 파일의 DISPLAY_NAMESIZE를 가져와서 별도의 TextView에 각각 표시합니다.

Kotlin

    /*
     * Get the file's content URI from the incoming Intent,
     * then query the server app to get the file's display name
     * and size.
     */
    returnIntent.data?.let { returnUri ->
        contentResolver.query(returnUri, null, null, null, null)
    }?.use { cursor ->
        /*
         * Get the column indexes of the data in the Cursor,
         * move to the first row in the Cursor, get the data,
         * and display it.
         */
        val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
        cursor.moveToFirst()
        findViewById<TextView>(R.id.filename_text).text = cursor.getString(nameIndex)
        findViewById<TextView>(R.id.filesize_text).text = cursor.getLong(sizeIndex).toString()
        ...
    }

Java

    ...
    /*
     * Get the file's content URI from the incoming Intent,
     * then query the server app to get the file's display name
     * and size.
     */
    Uri returnUri = returnIntent.getData();
    Cursor returnCursor =
            getContentResolver().query(returnUri, null, null, null, null);
    /*
     * Get the column indexes of the data in the Cursor,
     * move to the first row in the Cursor, get the data,
     * and display it.
     */
    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
    returnCursor.moveToFirst();
    TextView nameView = (TextView) findViewById(R.id.filename_text);
    TextView sizeView = (TextView) findViewById(R.id.filesize_text);
    nameView.setText(returnCursor.getString(nameIndex));
    sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
    ...

추가 관련 정보는 다음을 참조하세요.