我有Uri for Image文件.
我使用此代码从Uri获取文件路径:
public String getRealPathFromURI(Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = mContext.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} catch (Exception e) {
Log.message(e.getMessage());
} finally {
if (cursor != null) {
cursor.close();
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果我从Gallery应用程序(Android 4.4.2,arm-emu)中选择图像,
uri.getPath = /external/images/media/16 and it work's fine (My file path: /storage/sdcard/Download/0_cf15a_7800a7e5_orig.jpg)
Run Code Online (Sandbox Code Playgroud)
如果我从Documents app(Android 4.4.2,arm-emu)中选择图像,
I have uri.getPath = /document/image:16 and function getRealPathFromURI returns …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个使用相机应用程序录制视频的应用程序,然后将该视频保存在SD卡上,以便我可以播放它.我有一些代码,但我已经迷失了如何继续,因为我是Android的初学者.
我的活动:
public class Camcorder extends Activity {
private CamcorderView camcorderView;
private boolean recording = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//irrelevant code
camcorderView = (CamcorderView) findViewById(R.id.camcorder_preview);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
{
if (recording) {
camcorderView.stopRecording();
finish();
} else {
recording = true;
camcorderView.startRecording();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
}
Run Code Online (Sandbox Code Playgroud)
CamcorderView类:
public class CamcorderView extends SurfaceView implements …Run Code Online (Sandbox Code Playgroud)
UPDATE
我有运行8.0.0 T-Mobile的三星Galaxy S8 +,它在运行8.0.0时运行良好
我的三星Galaxy S9 +运行8.0.0 Verizon,每次都有非法参数失败.
我的三星Galaxy S9 +运行8.0.0 T-Mobile没有问题,工作正常
所以这可能是OEM特定的型号问题,但不知道如何解决它.我也试过重启电话,没有改变结果.
此外,我从Evernote中打开了公共下载并将文件保存为Note的附件,这告诉我Evernote能够正常访问公共目录并附加文件,因此可以在设备上执行.让我相信它与代码相关.
所以我最近升级了一个工作得很好的项目,现在它已经出现了一个错误,它正在使用构建工具28进行编译,用于最新版本的Android.
所以我一直使用这个PathUtil从隐含的意图中获取我需要的文件路径,以便从用户那里获取文件.我将在下面分享我正在使用的代码的链接.
它只是一个实用程序类,它检查提供程序权限并获取您尝试读取的文件的绝对路径.
当用户从公共下载目录中选择一个文件时,它返回onActivityResult:
content://com.android.providers.downloads.documents/document/2025
Run Code Online (Sandbox Code Playgroud)
现在,nice实用程序解析了这个并告诉我这是一个下载目录文件,并且是一个id为2025的文档.感谢实用程序,这是一个很好的开始.
接下来是使用内容解析器来查找文件绝对路径.这是以前的工作,但不再是:(.
现在路径实用程序只使用他们最有可能从核心库本身获得的合同数据.我试图导入提供程序类以避免静态字符串,但它似乎不可用,所以我想简单地使用匹配字符串是现在最好的方法.
以下是提供内容解析器所有访问权限的核心DownloadProvider供参考. DownloadProvider
注*此DownloadProvider是Androids,不是我的
以下是为contentProvider构建Uri的代码
val id = DocumentsContract.getDocumentId(uri)
val contentUri = ContentUris.withAppendedId(Uri.parse(PUBLIC_DOWNLOAD_PATH), id.toLong())
return getDataColumn(context, contentUri, null, null)
Run Code Online (Sandbox Code Playgroud)
来电参考:
private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array<String>?): String? {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if …Run Code Online (Sandbox Code Playgroud)