我正在为Android 2.1开发一个应用程序.我想让我的用户在我的应用程序中选择个人资料图片(我没有使用联系人框架).
理想的解决方案是启动一个使用户能够从图库中选择图像的意图,但如果没有合适的图像,则使用相机拍照(反之亦然,即允许用户拍照,但如果他们知道他们已经有了合适的图像,让他们进入画廊并选择所述图像).
目前我可以做其中一个但不能两个都做.
如果我使用MediaStore.ACTION_IMAGE_CAPTURE直接进入相机模式,则无法进入图库.
如果我使用Intent.ACTION_PICK直接进入图库,那么我可以选择一个图像,但是如果我单击相机按钮(在图库的右上角),则会触发新的相机意图.因此,拍摄的任何照片都不会直接返回给我的应用程序.(当然你可以按后退按钮退回到图库并从那里选择图像,但这是一个额外的不必要的步骤,并不是很直观).
那么有没有办法将两者结合起来,或者我是否必须提供一个菜单来从我的应用程序中做一个或另一个?看起来这将是一个常见的用例...当然我错过了什么?
我需要知道图库中图像的方向(由相机拍摄).我最初的方法是使用适用于我的Droid 1的MediaStore.Images.Media.ORIENTATION.在HTC Thunderbolt上测试时,手机只能将0保存到该字段.
然后我开始阅读exif数据:
ExifInterface exifReader = new ExifInterface(mFilePath);
exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
Run Code Online (Sandbox Code Playgroud)
这也为每个图像返回0.任何人都有关于如何正确获取Android照片的方向的想法?
为Android N编译我遇到了一个问题FileProvider.我需要让用户从相册中选择图像/用相机拍照然后将其裁剪成方形.
我已经成功实现了FileProvider用相机拍摄图像,但是从图库中选择图像时遇到了严重的问题.问题是在库中有很多来自不同地方的文件,例如我有Exception:
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/6133-3766/DCIM/100ANDRO/DSC_0035.JPG
Run Code Online (Sandbox Code Playgroud)
所以问题是,我可以把什么放到file_paths.xml来访问任何地方/storage/.我不能依赖于确切的路径,因为可能有来自WhatsApp和类似应用程序的图片,例如WhatsApp图像获取此路径:
/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20160821-WA0000.jpg
Run Code Online (Sandbox Code Playgroud)
我已设法解决空路径:
<external-path name="external_storage" path=""/>
其类似于Environment.getExternalStorageDirectory()根据文档.
但仍然无法弄清楚如何处理存储在其中的图像/storage/SOME_DIR/.请帮忙.
我有一个意图选择器,允许我从画廊或相机中选择图像,如下所示:
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null);
galleryIntent.setType("image/*");
galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent);
chooser.putExtra(Intent.EXTRA_TITLE, "title");
Intent[] intentArray = {cameraIntent};
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooser,REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
我希望我的onActivityResult方法是这样的:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(Condition == picture_coming_from_gallery)
{
//my code here
}
else if(condition == picture_coming_from_camera)
{
//another code here
}
}
Run Code Online (Sandbox Code Playgroud)
是什么条件让我知道我的图像来自哪个来源?
更新:
现在它正在运行,这是解决方案:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
{ …Run Code Online (Sandbox Code Playgroud) 我目前正在研究多图像选择器控件.我正在使用此允许用户为图像解决方案选择相机或图库,以生成用户从中选择一个可能的意图列表.
如下所示:
List<ResolveInfo> listGall = packageManager.queryIntentActivities(gallIntent, 0);
for (ResolveInfo res : listGall) {
final Intent finalIntent = new Intent(gallIntent);
finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
yourIntentsList.add(finalIntent);
}
Run Code Online (Sandbox Code Playgroud)
但我可以通过ResolveInfo及其属性解析的所有名称都不是用户友好的标签.所以我正在寻找获取给定活动的启动器名称的方法.
我正试图发起一个意图从相机或Android的画廊中选择一个图像.我检查过这篇文章,目前我的代码即将开始工作:
private Intent getPickIntent() {
final List<Intent> intents = new ArrayList<Intent>();
if (allowCamera) {
setCameraIntents(intents, cameraOutputUri);
}
if (allowGallery) {
intents.add(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI));
}
if (intents.isEmpty()) return null;
Intent result = Intent.createChooser(intents.remove(0), null);
if (!intents.isEmpty()) {
result.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[] {}));
}
return result;
}
private void setCameraIntents(List<Intent> cameraIntents, Uri output) {
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = context.getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for (ResolveInfo res : listCam) {
final String packageName = …Run Code Online (Sandbox Code Playgroud) 我试图让用户从图库中选择图像,或者用相机拍照.我试过这个:
Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
imageIntent.setType("image/*");
startActivityForResult(Intent.createChooser(imageIntent, "Select Picture"), GET_IMAGE_REQUEST);
Run Code Online (Sandbox Code Playgroud)
但它自动显示图库,甚至没有提供选择活动的选项.似乎应该有一些更好的方法来实现这个,而不是在这个问题中给出的解决方案.这真的是唯一的方法吗?
android android-intent android-gallery android-camera android-intent-chooser
我正在构建一个照片上传表单,该表单必须从相机或图库或任何其他可用资源(Dropbox/Google Drive/Astro文件管理器等)获取图像.我认为除了一个小组件外我都能正常工作.
当所选图像来自网络资源(例如Google云端硬盘)时,可能需要很长时间才能返回活动.我想使这个异步,以避免用户在图像下载时盯着黑屏.
我写了很多代码来完成整个工作,但这是它的一般过程:
活动开始并显示表单.
Intent选择器自动打开并要求用户从相机或其他应用程序中选择图像.
用户选择某些应用程序(如Google云端硬盘),选择图像并关闭该应用,然后返回所选图像Uri作为结果.
缓存文件的内容以解决方法KitKat权限,如果活动关闭并需要恢复,则可以阻止重新读取图像.
使用缓存文件作为源异步显示缩放位图.
Intent选择器关闭,图像显示在ImageButton中,并且表单对用户可见,在提交之前填写.
点击提交按钮后,将启动异步任务,允许将多部分上载到服务器.
异步上载使用回调函数来通知用户上载进度.
我陷入了#3和#4之间的过渡期.
如果我使用Thread或AsyncTask Intent选择器将保持打开状态,但图像也将显示在表单上.
如果我只是强迫用户等待(连续) 用户被卡住看黑屏,则意图选择器关闭,图像显示在表单上.
/**
* see http://stackoverflow.com/a/12347567/940217
*/
private void openImageIntent() {
// Camera.
final List<Intent> cameraIntents = new ArrayList<Intent>();
final PackageManager packageManager = getPackageManager();
Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile;
try {
uploadableImage.makeCameraTempFile();
photoFile = uploadableImage.getCameraTempFile();
uploadableImage.setCameraFilepath(photoFile.getAbsolutePath());
} catch (IOException ex) {
// Error occurred while creating the File
photoFile = null;
uploadableImage.invalidate();
Log.e(TAG, "Error while creating the temporary file needed …Run Code Online (Sandbox Code Playgroud) 我已经创建了自己的控制器,用Android相机拍照.我的问题是输出显示的图像比预期的要小.我已经检查了我的位图的宽度和高度,如下所示:
int w = bmp.getWidth();
int h = bmp.getHeight();
Run Code Online (Sandbox Code Playgroud)
这个输出w = 480和h = 640我假设是在像素的尺寸.这是我拍摄照片的方法
public void takePicture() {
Log.i("Camera View: ", "Take Picture");
camera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if (null != callback) {
callback.onJpegPictureTaken(data, camera);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我Activity订阅此活动的地方onJpegPictureTaken
@Override
public void onJpegPictureTaken(byte[] data, Camera camera) {
Intent i = new Intent(this, ImageEditing.class);
i.putExtra("image", data);
startActivity(i);
}
Run Code Online (Sandbox Code Playgroud)
这样做的目的是启动一个新Activity的以编辑图像,如缩放和拖动.这个ImageEditing.class得到如下图片:
flipped = flipByteArrayNintyDegress(getIntent().getExtras()
.getByteArray("image")); …Run Code Online (Sandbox Code Playgroud)