获取所有Android手机

时间:2015-11-24 11:53:48

标签: android camera

我想知道如何在没有用户拍照的情况下获得任何Android手机的相机文件夹路径

String cameraPath =  Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath();

这是我目前正在使用它并没有获得所有手机的路径

3 个答案:

答案 0 :(得分:0)

让我说清楚。无法获取任何Android设备的相机文件夹。为什么?因为没有存储媒体的标准。有些设备使用相机文件夹,一些DCMI文件夹,甚至一些设备在存储空间满了时更换文件夹。

答案 1 :(得分:0)

我知道这是一篇过时的文章,但是随着它在搜索中不断弹出,我会在该主题上留下一些更新的信息,也许有人会觉得有用。

  1. 根据我的经验和文档,就像其他人从一开始就指出的那样,没有“通用”的方法来获取所有可能设备上的文件路径。

  2. 随着Android 11的推出,将引入“范围存储”,它将影响开发人员与设备存储的交互方式。我将在下面留下一些细节:

在同一主题上,很长时间以来,我在我的应用程序中使用的方法与Savsani的答案非常相似,并且效果很好。不幸的是,就我而言,从OS 10开始这不再可行,因此我不得不修改我的代码,并修改上一个链接( ...用于处理媒体存储的官方文档

希望它可以帮助某人。

P.S。使用推荐的ContentUri,我遇到了一些严重的兼容性问题

int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
int nameColumn =
        cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
int durationColumn =
        cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);

while (cursor.moveToNext()) {
    // Get values of columns for a given video.
    long id = cursor.getLong(idColumn);
    String name = cursor.getString(nameColumn);
    int duration = cursor.getInt(durationColumn);
    int size = cursor.getInt(sizeColumn);

    Uri contentUri = ContentUris.withAppendedId(
            MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);

此问题与从设备上的格式为content://com.android.providers.media.documents/document/image%3A74的设备的Gallery文件夹获取路径有关

在这种情况下,最有效的方法是将两种路径解析方法都保留在代码中并相应地进行区分。至少目前,因为我必须发布更新。找到更好的解决方案后,如果仍然有人对此主题感兴趣,请在此处发布。

更新:

经过多种测试和方法后,我认为进入尽可能多的设备的最佳方法是检查上传的文件是否是媒体文件(Savsani的答案中有更多选项)并获取文件路径直接从该URI进行操作

 public static String filePathFrom(Uri uri) {
        if (uri == null) return null;

        ContentResolver resolver = Fbn.getInstance().getContentResolver();
        FileInputStream input = null;
        FileOutputStream output = null;


        try {
            ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
            if (pfd == null) {
                return null;
            }
            FileDescriptor fd = pfd.getFileDescriptor();
            input = new FileInputStream(fd);

            File outputDir = context.getCacheDir();
            File outputFile = File.createTempFile("photo_", ".jpg", outputDir);
            String tempFilename = outputFile.getAbsolutePath();
            output = new FileOutputStream(tempFilename);

            int read;
            byte[] bytes = new byte[4096];
            while ((read = input.read(bytes)) != -1) {
                output.write(bytes, 0, read);
            }

            return new File(tempFilename).getAbsolutePath();
        } catch (Exception ignored) {

            ignored.getStackTrace();
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
                if (output != null) {
                    output.close();
                }
            } catch (Throwable t) {
                // Do nothing
            }
        }
        return "";
    }

答案 2 :(得分:-1)

使用此方法获取媒体路径。

这将 所有Android设备 中的 工作

只需传递上下文和Uri即可获取媒体路径。

示例:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Your other code goes here for get Image from camera or gallery
        Uri fileUri = data.getData();
        String path = getPath(getApplicationContext(), fileUri); 
}

此方法将为您提供任何Android设备中的文件路径。

public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[] { split[1] };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     * 
     * @param context
     *            The context.
     * @param uri
     *            The Uri to query.
     * @param selection
     *            (Optional) Filter used in the query.
     * @param selectionArgs
     *            (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = { column };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }