2023年7月15日土曜日

ActivityResultContracts.CreateDocument に指定する mimeType には * を使ってはいけない

mimeType に "text/*"、ファイル名に "sample.csv" を指定した場合、ファイル名が重複したときの "(1)" が拡張子の後につけられてしまう。 @Composable fun CreateDocumentSample() { val createDocumentLauncher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("text/*")) { if (it != null) { ... } } Button( onClick = { createDocumentLauncher.launch("sample.csv") } ) { Text("Click") } }


mimeType を "text/csv" にし、ファイル名を "sample.csv" や "sample" にした場合、ファイル名が重複したときの "(1)" が拡張子の前になる。 @Composable fun CreateDocumentSample() { val createDocumentLauncher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("text/csv")) { if (it != null) { ... } } Button( onClick = { createDocumentLauncher.launch("sample.csv") } ) { Text("Click") } }
@Composable fun CreateDocumentSample() { val createDocumentLauncher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("text/csv")) { if (it != null) { ... } } Button( onClick = { createDocumentLauncher.launch("sample") } ) { Text("Click") } }


名前についている拡張子が mimeType と異なる場合その部分は拡張子とは認識されず、mimeType に基づいた拡張子がつきます。

以下では mimeType が "text/plain" でファイル名が "sample.csv" なので ".csv" は拡張子とは認識されず、実際のファイル名は "sample.csv.txt" になります。 @Composable fun CreateDocumentSample() { val createDocumentLauncher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { if (it != null) { ... } } Button( onClick = { createDocumentLauncher.launch("sample.csv") } ) { Text("Click") } }