Android 在图像视图中显示安卓系统中照相机拍摄的照片
我正在尝试以下几点:Android 在图像视图中显示安卓系统中照相机拍摄的照片,android,imageview,android-photoview,Android,Imageview,Android Photoview,我正在尝试以下几点: 用我的Android设备拍照 使用步骤#1中拍摄的照片填充图像视图 我试着按照下面列出的教程进行操作 但似乎什么都不管用。这是我的密码 简化布局xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="ver
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp">
<ImageView
android:id="@+id/crime_photo"
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@android:color/darker_gray"
android:contentDescription="@string/show_a_picture"
android:cropToPadding="true"
android:scaleType="centerInside" />
<ImageButton
android:id="@+id/crime_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/take_a_picture"
android:src="@android:drawable/ic_menu_camera" />
</LinearLayout>
我的Android清单
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myproject.criminalintent.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:resource="@xml/files" android:name="android.support.FILE_PROVIDER_PATHS"/>
</provider>
更新#2:拍摄完照片后,相机不会返回到活动结果,就像
更新
这就是对我有效的解决方案
private void updatePhotoview() {
if (mPhotoPath == null) {
mPhotoPath = mCrime.getPhotoFilePath();
}
if (mPhotoPath == null) {
return;
}
final Uri uri = Uri.parse("file://" + mPhotoPath);
final ViewTreeObserver vo = mPhotoView.getViewTreeObserver();
vo.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int finalHeight = mPhotoView.getMeasuredHeight();
int finalWidth = mPhotoView.getMeasuredWidth();
Bitmap bitmap = PictureUtils.getScaledBitmap(uri, finalHeight, finalWidth, getActivity());
mPhotoView.setImageBitmap(bitmap);
CrimeLab.get(getActivity()).updateCrime(mCrime);
if (Util.isOsVersionGreaterOrEqualTo(Build.VERSION_CODES.JELLY_BEAN)) {
mPhotoView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_CAMERA) {
updatePhotoview();
}
}
在XML中:
<ImageView
android:id="@+id/profilePic"
android:layout_width="@dimen/sdp105"
android:layout_height="@dimen/sdp105"
android:layout_centerHorizontal="true"
android:background="@drawable/border"
android:src="@drawable/ic_profile" />
<ImageButton
android:id="@+id/crime_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/take_a_picture"
android:src="@android:drawable/ic_menu_camera" />
在XML中:
<ImageView
android:id="@+id/profilePic"
android:layout_width="@dimen/sdp105"
android:layout_height="@dimen/sdp105"
android:layout_centerHorizontal="true"
android:background="@drawable/border"
android:src="@drawable/ic_profile" />
<ImageButton
android:id="@+id/crime_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/take_a_picture"
android:src="@android:drawable/ic_menu_camera" />
只要使用这个类。您可以获得权限,获取图像并在imageview中显示它。 如果需要任何帮助,请回复评论,谢谢
public class CameraFragment extends android.support.v4.app.Fragment {
private String imageFilePath;
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
private String visitingCard;
private ImageView visitingCardImage;
public CameraFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment_camera, container, false);
if(checkPermission()){
openCameraIntent();
}
visitingCardImage = view.findViewById(R.id.crime_photo);
return view;
}
public static String getBase64String(Bitmap image) {
String encodeString = null;
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
encodeString = Base64.encodeToString(byteArray, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
return encodeString;
}
BitmapFactory.Options options;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//getActivity();
String compressedPath = null;
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {
try {
ImageCompressor compressor = new ImageCompressor();
compressedPath = compressor.compressImage(imageFilePath, getActivity());
Bitmap bitmap = BitmapFactory.decodeFile(compressedPath);
visitingCardImage.setImageBitmap(bitmap);
visitingCard = getBase64String(bitmap);
} catch (OutOfMemoryError e) {
try {
options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(compressedPath, options);
visitingCardImage.setImageBitmap(bitmap);
visitingCard = getBase64String(bitmap);
//return bitmap;
} catch(Exception el) {
el.printStackTrace();
}
}
} else {
Toast.makeText(getActivity(), "cancelled image capture", Toast.LENGTH_SHORT).show();
}
}
private void openCameraIntent() {
Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (pictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile;
try {
photoFile = createImageFile();
} catch (IOException e) {
e.printStackTrace();
return;
}
Uri photoUri;
if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
photoUri = Uri.fromFile(photoFile);
} else {
photoUri = FileProvider.getUriForFile(getActivity(), getActivity().getPackageName() + ".provider", photoFile);
}
pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(pictureIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
Log.i(TAG, "User interaction was cancelled.");
}else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCameraIntent();
}
}
}
//endregion
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "IMG_" + timeStamp + "_";
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
imageFilePath = image.getAbsolutePath();
return image;
}
private boolean checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_REQUEST_CODE);
return false;
}
} else {
return true;
}
}
}
公共类CameraFragment扩展了android.support.v4.app.Fragment{
私有字符串imageFilePath;
专用静态最终int摄像机\捕获\图像\请求\代码=100;
私有静态最终整数请求\权限\请求\代码=34;
私人字符串访问卡;
私人图像查看访问CardImage;
公共摄影机片段(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
设置选项菜单(真);
super.onCreate(savedInstanceState);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u fragment\u摄像机,容器,假);
if(checkPermission()){
openCameraIntent();
}
visitingCardImage=view.findViewById(R.id.crime\U照片);
返回视图;
}
公共静态字符串getBase64String(位图图像){
字符串encodeString=null;
试一试{
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream);
字节[]byteArray=byteArrayOutputStream.toByteArray();
encodeString=Base64.encodeToString(byteArray,Base64.DEFAULT);
}捕获(例外e){
e、 printStackTrace();
}
返回编码字符串;
}
选项;
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
//getActivity();
字符串compressedPath=null;
if(requestCode==相机\拍摄\图像\请求\代码和结果代码==结果\确定){
试一试{
ImageCompressor=新的ImageCompressor();
compressedPath=compressor.compressImage(imageFilePath,getActivity());
位图位图=位图工厂.decodeFile(压缩路径);
visitingCardImage.setImageBitmap(位图);
visitingCard=getBase64String(位图);
}捕获(OutOfMemory错误){
试一试{
options=新的BitmapFactory.options();
options.inSampleSize=2;
位图位图=BitmapFactory.decodeFile(压缩路径,选项);
visitingCardImage.setImageBitmap(位图);
visitingCard=getBase64String(位图);
//返回位图;
}捕获(异常el){
el.printStackTrace();
}
}
}否则{
Toast.makeText(getActivity(),“取消图像捕获”,Toast.LENGTH_SHORT.show();
}
}
私人空旷露天活动帐篷(){
意向图片内容=新意向(MediaStore.ACTION\u IMAGE\u CAPTURE);
if(PictureContent.resolveActivity(getActivity().getPackageManager())!=null){
文件照片文件;
试一试{
photoFile=createImageFile();
}捕获(IOE异常){
e、 printStackTrace();
返回;
}
Uri-photoUri;
if(android.os.Build.VERSION.SDK_INT=23){
if(ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.CAMERA)==PackageManager.permission\u已授予
&&ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.permission_已授予){
返回true;
}否则{
requestPermissions(新字符串[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSIONS_REQUEST_CODE);
返回false;
}
}否则{
返回true;
}
}
}
在清单文件中添加
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
只需使用此类。您可以获得权限,获取图像并在imageview中显示。 如果需要任何帮助,请回复评论,谢谢
public class CameraFragment extends android.support.v4.app.Fragment {
private String imageFilePath;
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
private String visitingCard;
private ImageView visitingCardImage;
public CameraFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment_camera, container, false);
if(checkPermission()){
openCameraIntent();
}
visitingCardImage = view.findViewById(R.id.crime_photo);
return view;
}
public static String getBase64String(Bitmap image) {
String encodeString = null;
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
encodeString = Base64.encodeToString(byteArray, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
return encodeString;
}
BitmapFactory.Options options;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//getActivity();
String compressedPath = null;
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {
try {
ImageCompressor compressor = new ImageCompressor();
compressedPath = compressor.compressImage(imageFilePath, getActivity());
Bitmap bitmap = BitmapFactory.decodeFile(compressedPath);
visitingCardImage.setImageBitmap(bitmap);
visitingCard = getBase64String(bitmap);
} catch (OutOfMemoryError e) {
try {
options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(compressedPath, options);
visitingCardImage.setImageBitmap(bitmap);
visitingCard = getBase64String(bitmap);
//return bitmap;
} catch(Exception el) {
el.printStackTrace();
}
}
} else {
Toast.makeText(getActivity(), "cancelled image capture", Toast.LENGTH_SHORT).show();
}
}
private void openCameraIntent() {
Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (pictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile;
try {
photoFile = createImageFile();
} catch (IOException e) {
e.printStackTrace();
return;
}
Uri photoUri;
if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
photoUri = Uri.fromFile(photoFile);
} else {
photoUri = FileProvider.getUriForFile(getActivity(), getActivity().getPackageName() + ".provider", photoFile);
}
pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(pictureIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
Log.i(TAG, "User interaction was cancelled.");
}else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCameraIntent();
}
}
}
//endregion
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "IMG_" + timeStamp + "_";
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
imageFilePath = image.getAbsolutePath();
return image;
}
private boolean checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_REQUEST_CODE);
return false;
}
} else {
return true;
}
}
}
公共类CameraFragment扩展了android.support.v4.app.Fragment{
私有字符串imageFilePath;
专用静态最终int摄像机\捕获\图像\请求\代码=100;
私有静态最终整数请求\权限\请求\代码=34;
私人字符串访问卡;
私人图像查看访问CardImage;
公共摄影机片段(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
设置选项菜单(真);
super.onCreate(savedInstanceState);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u fragment\u摄像机,容器,假);
if(checkPermission()){
openCameraIntent();
}
visitingCardImage=view.findViewById(R.id.crime\U照片);
返回视图;
}
公共静态字符串getBase64String(位图图像){
字符串encodeString=null;
试一试{
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
image.compress(位图.CompressF
public class CameraFragment extends android.support.v4.app.Fragment {
private String imageFilePath;
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
private String visitingCard;
private ImageView visitingCardImage;
public CameraFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment_camera, container, false);
if(checkPermission()){
openCameraIntent();
}
visitingCardImage = view.findViewById(R.id.crime_photo);
return view;
}
public static String getBase64String(Bitmap image) {
String encodeString = null;
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
encodeString = Base64.encodeToString(byteArray, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
return encodeString;
}
BitmapFactory.Options options;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//getActivity();
String compressedPath = null;
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {
try {
ImageCompressor compressor = new ImageCompressor();
compressedPath = compressor.compressImage(imageFilePath, getActivity());
Bitmap bitmap = BitmapFactory.decodeFile(compressedPath);
visitingCardImage.setImageBitmap(bitmap);
visitingCard = getBase64String(bitmap);
} catch (OutOfMemoryError e) {
try {
options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(compressedPath, options);
visitingCardImage.setImageBitmap(bitmap);
visitingCard = getBase64String(bitmap);
//return bitmap;
} catch(Exception el) {
el.printStackTrace();
}
}
} else {
Toast.makeText(getActivity(), "cancelled image capture", Toast.LENGTH_SHORT).show();
}
}
private void openCameraIntent() {
Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (pictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile;
try {
photoFile = createImageFile();
} catch (IOException e) {
e.printStackTrace();
return;
}
Uri photoUri;
if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
photoUri = Uri.fromFile(photoFile);
} else {
photoUri = FileProvider.getUriForFile(getActivity(), getActivity().getPackageName() + ".provider", photoFile);
}
pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(pictureIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
Log.i(TAG, "User interaction was cancelled.");
}else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCameraIntent();
}
}
}
//endregion
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "IMG_" + timeStamp + "_";
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
imageFilePath = image.getAbsolutePath();
return image;
}
private boolean checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_REQUEST_CODE);
return false;
}
} else {
return true;
}
}
}
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />