android 从不带扩展名的内容URI确定文件类型

vohkndzv  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(353)

我目前正在Android应用程序中使用内容URI,我需要一种可靠的方法来确定给定URI的文件类型。挑战在于这些URI没有任何与之关联的文件扩展名。例如,我想确定URI是否对应于CSS文件、JSON文件或任何其他特定的文件类型。
下面是我用来检索MIME类型的代码:

  1. ContentResolver contentResolver = this.getContentResolver();
  2. String mimeType = null;
  3. Cursor cursor = contentResolver.query(uri, null, null, null, null);
  4. try {
  5. if (cursor != null && cursor.moveToFirst()) {
  6. int mimeTypeColumnIndex = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_MIME_TYPE);
  7. if (mimeTypeColumnIndex != -1) {
  8. mimeType = cursor.getString(mimeTypeColumnIndex);
  9. }
  10. }
  11. } finally {
  12. if (cursor != null) {
  13. cursor.close();
  14. }
  15. }

如果MIME类型为null或等于“application/force-download”,我将返回到另一个名为detectMimeTypeUsingTika 1的方法,该方法利用Apache Tika库根据URI的内容检测MIME类型。然而,我注意到这个方法对于CSS、JS和JSON文件也始终返回“text/plain”。
下面是detectMimeTypeUsingTika 1的代码:

  1. public static String detectMimeTypeUsingTika1(Uri uri, ContentResolver contentResolver) {
  2. try {
  3. InputStream inputStream = contentResolver.openInputStream(uri);
  4. Tika tika = new Tika();
  5. return tika.detect(inputStream);
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }
  9. return null;
  10. }

有没有人可以建议一种更准确的方法或对我现有代码的任何改进,使我能够根据内容URI正确识别文件类型?目前,detectMimeTypeUsingTika 1方法始终为CSS、JS和JSON文件返回“text/plain”。我希望能够区分这些文件类型和其他文件类型,而不仅仅依赖于文件扩展名。谢谢你!

bvhaajcl

bvhaajcl1#

要确定Android应用中内容URI的文件类型,可以通过从文件的显示名称中提取文件扩展名来提高代码的准确性。下面是代码的一个更短更简单的版本:

  1. String type = null;
  2. Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
  3. if (cursor != null && cursor.moveToFirst()) {
  4. String fileName = cursor.getString(0);
  5. type = fileName.substring(fileName.lastIndexOf("."));
  6. }

此代码段从光标检索文件的显示名称,然后使用子字符串提取文件扩展名。通过这样做,您可以准确地识别文件类型,而不仅仅依赖于文件扩展名。

相关问题