我onActivityResult从mediastore图像选择返回,我可以使用以下内容获取图像的URI:
Uri selectedImage = data.getData();
Run Code Online (Sandbox Code Playgroud)
将其转换为字符串可以得到:
content://media/external/images/media/47
Run Code Online (Sandbox Code Playgroud)
或者路径给出:
/external/images/media/47
Run Code Online (Sandbox Code Playgroud)
但是我似乎无法找到将其转换为绝对路径的方法,因为我想将图像加载到位图而不必将其复制到某处.我知道这可以使用URI和内容解析器完成,但这似乎在重新启动手机时中断,我想MediaStore在重新启动之间不会保持其编号相同.
我正在捕捉图像并将其设置为图像视图.
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// …Run Code Online (Sandbox Code Playgroud) 在KitKat之前(或在新Gallery之前)Intent.ACTION_GET_CONTENT返回这样的URI
内容://媒体/外部/图像/媒体/ 3951.
使用ContentResolver和quering
MediaStore.Images.Media.DATA返回文件URL.
但是在KitKat中,Gallery会返回一个URI(通过"Last"),如下所示:
内容://com.android.providers.media.documents/document/image:3951
我该如何处理?
android android-intent android-contentresolver android-gallery
自从过去几天以来,我一直在努力从WebView上传文件,但没有任何进展.我用谷歌搜索并实现了所有建议的解决方案,但都没有,例如:此处建议的解决方案,等等.
问题:我有一个带有以下代码的HTML页面来上传文件.它在Firefox等桌面浏览器和模拟器/ AVD的内置浏览器中工作正常,当我点击元素呈现的"浏览..."按钮时,浏览器会打开一个对话框,我可以在其中选择要上传的文件.
但是,在android 3.0模拟器/ AVD中,当我点击"选择文件"时,没有任何反应,没有打开文件对话框!
<form method="POST" enctype="multipart/form-data">
File to upload: <input type="file" name="uploadfile">
<input type="submit" value="Press to Upload..."> to upload the file!
</form>
Run Code Online (Sandbox Code Playgroud)
有人可以最早建议一个可能的解决方案.
我正在构建一个使用相机拍照的应用程序.这是我的源代码:
File file = new File(Environment.getExternalStorageDirectory(),
imageFileName);
imageFilePath = file.getPath();
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, ACTIVITY_NATIVE_CAMERA_AQUIRE);
Run Code Online (Sandbox Code Playgroud)
在onActivityResult()方法上,我BitmapFactory.decodeStream()用来拾取图像.
当我在Nexus上运行我的应用程序时,它运行良好.但是当我在三星Galaxy S或HTC Inspire 4G上运行时,图像的方向是不正确的.

拍摄后的图像预览--------- SD卡上的真实图像
拍摄后的图像预览--------- SD卡上的真实图像
我正试图从画廊获取图像.
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select picture"), resultCode );
Run Code Online (Sandbox Code Playgroud)
从这个活动返回后,我有一个包含Uri的数据.看起来像:
content://media/external/images/1
Run Code Online (Sandbox Code Playgroud)
如何将此路径转换为真实路径(就像' /sdcard/image.png')?
谢谢
所以基本上我想要实现的是Gallery在Android中打开并让用户选择multiple images.现在这个问题经常被问到,但我对答案不满意.主要是因为我在我的IDE中找到了de docs中的一些有趣内容(我稍后再回过头来),因此我不想使用自定义适配器而只需要使用自定义适配器.
现在我选择一个图像的代码是:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Run Code Online (Sandbox Code Playgroud)
现在SO和其他网站上的人们会告诉你,你有两个选择:
1)不要使用ACTION_GET_CONTENT而是使用ACTION_SEND_MULTIPLE.
这个不起作用.这个是根据文件的sending文件,而不是retrieving,这正是它的作用.当使用ACTION_SEND_MULTIPLE时,我在我的设备上打开了一个窗口,我必须选择一个应用程序来发送我的数据.这不是我想要的,所以我想知道人们是如何通过这个解决方案实现这一目标的.我想念一些东西吗?
2)实施custom Gallery.现在这是我将考虑的最后一个选项,因为我不是我要搜索的东西,因为我必须自己设计风格以及为什么你不能在香草画廊中选择多个图像?
必须有一个选项..现在我发现的有趣的是这个:
我在文档描述中找到了这个ACTION_GET_CONTENT.
如果调用者可以处理多个返回的项(用户执行多个选择),那么它可以指定EXTRA_ALLOW_MULTIPLE来指示这一点.
这非常有趣.在这里,他们将其引用到用户可以选择多个项目的用例?
后来他们在文档中说:
您可以使用EXTRA_ALLOW_MULTIPLE来允许用户选择多个项目.
所以这很明显吧?这就是我需要的.但我的以下问题是:我可以把它放在哪里EXTRA_ALLOW_MULTIPLE?令人遗憾的是,我无法在developers.android指南中找到它,也没有在INTENT类中将其定义为常量.
有人可以帮我解决这个问题EXTRA_ALLOW_MULTIPLE吗?
我尝试了一个解决方案(见下文)工作正常,除了在Android 4.4中调用startActivityForResult()一个名为"Open from"的活动,其中包含"Recent","Images","Downloads"以及几个可供选择的应用程序.当我选择"图像"并尝试解析返回的内容URI(使用下面的代码)时,调用cursor.getString()返回null.如果我使用Gallery应用程序选择完全相同的文件,则cursor.getString()返回文件路径.我只在API级别16和19中对此进行了测试.一切都按照16中的预期运行.至于19,我必须选择Gallery或其他应用程序,否则它不起作用.
private String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(column_index);
return path;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想让用户从图库中选择个人资料图片.我的问题是有些图片是向右旋转的.
我像这样启动图像选择器:
Intent photoPickerIntent = new Intent();
photoPickerIntent.setType("image/*");
photoPickerIntent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(photoPickerIntent, "Select profile picture"), Global.CODE_SELECT_PICTURE);
Run Code Online (Sandbox Code Playgroud)
我从onActivityResult获取图像,如下所示:
Uri selectedPicture = data.getData();
profilePic = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), selectedPicture);
Run Code Online (Sandbox Code Playgroud)
如何让图像不被旋转?
更新:
根据我收到的一些有用的答案,我设法提出了以下工作解决方案(这只是一个工作代码,写得不好).我很想得到你如何改进它的反馈!
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == Global.CODE_SELECT_PICTURE) {
// Get selected gallery image
Uri selectedPicture = data.getData();
// Get and resize profile image
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = activity.getContentResolver().query(selectedPicture, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex); …Run Code Online (Sandbox Code Playgroud) 我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...
作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。
这意味着许多框架将需要依赖SAF而不是File和file-path。
其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:
packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。packageInfo.packageNamepackageInfo.versionCode或packageInfo.longVersionCode。packageInfo.versionName一种。 BitmapFactory.decodeResource(packageManager.getResourcesForApplication(applicationInfo),packageInfo.applicationInfo.icon, bitmapOptions)
b。如果已安装,AppCompatResources.getDrawable(createPackageContext(packageInfo.packageName, 0), packageInfo.applicationInfo.icon )
C。 ResourcesCompat.getDrawable(packageManager.getResourcesForApplication(applicationInfo), packageInfo.applicationInfo.icon, null)
它还有很多其他功能,它们可以返回您,还有很多可选功能,但我认为这些是有关APK文件的基本详细信息。
我希望Google可以为此提供一个很好的替代方法(在此和此处要求),因为目前我找不到任何好的解决方案。
使用从SAF获得的Uri并从中获得InputStream很容易:
@TargetApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
packageInstaller = packageManager.packageInstaller
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "application/vnd.android.package-archive"
startActivityForResult(intent, 1)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { …Run Code Online (Sandbox Code Playgroud) android inputstream apk android-package-managers scoped-storage
android ×10
apk ×1
camera ×1
filepath ×1
image ×1
inputstream ×1
mediastore ×1
orientation ×1
rotation ×1
uri ×1
webview ×1