为什么我的照片不会显示在我的图像视图上
问题描述:
我不知道为什么,但是我拍摄的图像不会显示在我的图像视图上。如果我尝试显示已经在我的应用中的图像(例如,在mipmap文件夹中),它将显示该图像,但它不会显示我拍摄的图像。我的代码有问题吗?为什么我的照片不会显示在我的图像视图上
private File imageFile;
private static final int PHOTO_TAKEN = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo_taker);
addSnapButtonListener();
}
private void addSnapButtonListener(){
Button snapBtn = (Button) findViewById(R.id.camera_button);
snapBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
File picturesDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
imageFile = new File(picturesDirectory, "passpoints_image");
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
startActivityForResult(i, PHOTO_TAKEN);
}
});
}
protected void onActivityResult(int reqC, int resC, Intent data) {
if(reqC == PHOTO_TAKEN){
// Bitmap photo = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
Bitmap photo = (Bitmap) data.getExtras().get(imageFile.getAbsolutePath());
// Bitmap photo = (Bitmap) data.getExtras().get("data");
if(photo != null){
ImageView imageView = (ImageView)findViewById(R.id.taken_image);
imageView.setImageBitmap(photo);
} else {
Toast.makeText(this, R.string.unable_to_set_photo_file, Toast.LENGTH_LONG).show();
}
}
}
我尝试了几个不同的方法来让我的拍摄的图像(因为你可以用注释掉的代码中看到的),但每当我拍照,我看它的ImageView尚属空白。
当我尝试从图库中显示图像时,也会发生这种情况。我的手机有问题吗?
编辑:此外,图像路径确实得到注册,因为我可以检索它并将其显示在吐司或日志中,所以我不认为这是问题的一部分。
答
Bitmap photo = (Bitmap) data.getExtras().get(imageFile.getAbsolutePath());
这将返回null
,因为没有额外的名称。
此代码,您已经注释掉,接近:
Bitmap photo = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
但是,你需要保留imageFile
,为您的活动可能会被破坏或将相机的应用程序是在你的进程可能会被终止前景。而且,Uri.fromFile()
在您将targetSdkVersion
移至24或更高时,将无法在Android 7.0及更高版本的设备上使用。另外,请勿在主应用程序线程上的BitmapFactory
上调用decode...()
,因为当磁盘I/O和计算正在进行时,您的UI将冻结。
This sample app(从my book,FWIW),展示了使用FileProvider
代替Uri.fromFile()
和保持使用onSaveInstanceState()
的路径。就我而言,我通过展示的ACTION_VIEW
图像,而不是装载到一个ImageView
:
/***
Copyright (c) 2008-2016 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
https://commonsware.com/Android
*/
package com.commonsware.android.camcon;
import android.app.Activity;
import android.content.ClipData;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import java.io.File;
import java.util.List;
public class CameraContentDemoActivity extends Activity {
private static final String EXTRA_FILENAME=
"com.commonsware.android.camcon.EXTRA_FILENAME";
private static final String FILENAME="CameraContentDemo.jpeg";
private static final int CONTENT_REQUEST=1337;
private static final String AUTHORITY=
BuildConfig.APPLICATION_ID+".provider";
private static final String PHOTOS="photos";
private File output=null;
private Uri outputUri=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (savedInstanceState==null) {
output=new File(new File(getFilesDir(), PHOTOS), FILENAME);
if (output.exists()) {
output.delete();
}
else {
output.getParentFile().mkdirs();
}
}
else {
output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME);
}
outputUri=FileProvider.getUriForFile(this, AUTHORITY, output);
if (savedInstanceState==null) {
i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) {
ClipData clip=
ClipData.newUri(getContentResolver(), "A photo", outputUri);
i.setClipData(clip);
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
else {
List<ResolveInfo> resInfoList=
getPackageManager()
.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
startActivityForResult(i, CONTENT_REQUEST);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(EXTRA_FILENAME, output);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == CONTENT_REQUEST) {
if (resultCode == RESULT_OK) {
Intent i=new Intent(Intent.ACTION_VIEW);
i.setDataAndType(outputUri, "image/jpeg");
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(i);
finish();
}
}
}
}
如果我要加载此为ImageView
,我会用an image-loading library像Picasso。
您是否确认在您的活动中一切正常?尝试添加日志。如果你的Bitmap被返回为null,那么当你设置它时,它不会在视图中显示任何东西。但要消除这种可能性,请使用其他设备。 – JoxTraex