Android Camera 三星BUG  :

近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了  只有在三星的相机上遇到了bug .

BUG详细体现为 :

(1) 摄像头拍照后图片数据不一定能返回 ;  onActivityResult的data为空

(2) 三星的camera强制切换到横屏  导致Activity重新启动生命周期 (可是部分机型  配置  android:configChanges  也不能阻止横竖屏切换);

我的解决方法为

假设 activity 的销毁假设无法避免   那么在activity销毁之前调用 onSaveInstanceState  保存图片的路径

当activity又一次创建的时候 会将 onSaveInstanceState  保存的文件传递给onCreate()其中

在onCreate其中  检查照片的地址是否存在文件  以此来判定拍照是否成功

运气不错  最终通过了測试同学们的验证.....

我的代码例如以下:

配置   Androidmanifest.xml  中的配置 activity

        <activity
android:name=".UseCameraActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|navigation"
android:launchMode="singleTop"
android:screenOrientation="portrait" />

添加权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

贴上代码:

1) 主activity

功能是: 依据指定的路径  生成bitmap  ; 显示图片

package com.example.camerabaozi;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream; import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /**
* 启动界面
*
* 照片生成的文件夹在 sd卡的/a/image/camera/.. .jpg
*
* @author baozi
*
*/
public class MainActivity extends Activity { protected static final int REQCAMERA = 11;
private static final String TAG = "MainActivity";
private View button1;
private ImageView photo_iv;
private ContentResolver mContentResolver;
final int IMAGE_MAX_SIZE = 1024; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContentResolver = getContentResolver(); button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
UseCameraActivity.class);
startActivityForResult(intent, REQCAMERA);
}
});
photo_iv = (ImageView) findViewById(R.id.imageView1); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQCAMERA:
String path = data.getStringExtra(UseCameraActivity.IMAGE_PATH);
Log.i("123", path); // 依据照片的位置获取图片
Bitmap bitmap = getBitmap(path);
photo_iv.setImageBitmap(bitmap); // ImageLoader.getInstance().displayImage(
// getImageUri(path).toString(), photo_iv); break; default:
super.onActivityResult(requestCode, resultCode, data);
break;
} } private Uri getImageUri(String path) { return Uri.fromFile(new File(path));
} private Bitmap getBitmap(String path) { Uri uri = getImageUri(path);
InputStream in = null;
try {
in = mContentResolver.openInputStream(uri); // Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true; BitmapFactory.decodeStream(in, null, o);
in.close(); int scale = 1;
if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
scale = (int) Math.pow(
2,
(int) Math.round(Math.log(IMAGE_MAX_SIZE
/ (double) Math.max(o.outHeight, o.outWidth))
/ Math.log(0.5)));
} BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
in = mContentResolver.openInputStream(uri);
Bitmap b = BitmapFactory.decodeStream(in, null, o2);
in.close(); return b;
} catch (FileNotFoundException e) {
Log.e(TAG, "file " + path + " not found");
} catch (IOException e) {
Log.e(TAG, "file " + path + " not found");
}
return null;
}
}
// ┏┓   ┏┓
// ┏┛┻━━━┛┻┓
// ┃       ┃  
// ┃   ━   ┃
// ┃ ┳┛ ┗┳ ┃
// ┃       ┃
// ┃   ┻   ┃
// ┃       ┃
// ┗━┓   ┏━┛
// ┃   ┃ 神兽保佑        
// ┃   ┃ 代码无BUG。
// ┃   ┗━━━┓
// ┃       ┣┓
// ┃       ┏┛
// ┗┓┓┏━┳┓┏┛
// ┃┫┫ ┃┫┫
// ┗┻┛ ┗┻┛

2)  UseCameraActivity.java

本类的功能是调用   生成图片拍摄后的路径

照片生成的文件夹在 sd卡的/a/image/camera/.. .jpg

package com.example.camerabaozi;

import java.io.File;
import java.io.IOException; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log; /**
* 照片生成的文件夹在 sd卡的/a/image/camera/.. .jpg
*
* @author baozi
*
*/
public class UseCameraActivity extends Activity {
private String mImageFilePath;
public static final String IMAGEFILEPATH = "ImageFilePath";
public final static String IMAGE_PATH = "image_path";
static Activity mContext;
public final static int GET_IMAGE_REQ = 5000;
private static Context applicationContext; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //推断 activity被销毁后 有没有数据被保存下来
if (savedInstanceState != null) { mImageFilePath = savedInstanceState.getString(IMAGEFILEPATH); Log.i("123---savedInstanceState", mImageFilePath); File mFile = new File(IMAGEFILEPATH);
if (mFile.exists()) {
Intent rsl = new Intent();
rsl.putExtra(IMAGE_PATH, mImageFilePath);
setResult(Activity.RESULT_OK, rsl);
Log.i("123---savedInstanceState", "图片拍摄成功");
finish();
} else {
Log.i("123---savedInstanceState", "图片拍摄失败");
}
} mContext = this;
applicationContext = getApplicationContext();
if (savedInstanceState == null) {
initialUI();
} } public void initialUI() {
//依据时间生成 后缀为 .jpg 的图片
long ts = System.currentTimeMillis();
mImageFilePath = getCameraPath() + ts + ".jpg";
File out = new File(mImageFilePath);
showCamera(out); } private void showCamera(File out) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out)); // set
startActivityForResult(intent, GET_IMAGE_REQ);
} @Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (GET_IMAGE_REQ == requestCode && resultCode == Activity.RESULT_OK) { Intent rsl = new Intent();
rsl.putExtra(IMAGE_PATH, mImageFilePath);
mContext.setResult(Activity.RESULT_OK, rsl);
mContext.finish(); } else {
mContext.finish();
}
} @Override
protected void onDestroy() {
super.onDestroy();
} @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("ImageFilePath", mImageFilePath + ""); } @Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState); } public static String getCameraPath() {
String filePath = getImageRootPath() + "/camera/";
File file = new File(filePath);
if (!file.isDirectory()) {
file.mkdirs();
}
file = null;
return filePath;
} public static String getImageRootPath() {
String filePath = getAppRootPath() + "/image";
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
file = null;
return filePath;
} public static String getAppRootPath() {
String filePath = "/a";
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
filePath = Environment.getExternalStorageDirectory() + filePath;
} else {
filePath = applicationContext.getCacheDir() + filePath;
}
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
file = null;
File nomedia = new File(filePath + "/.nomedia");
if (!nomedia.exists())
try {
nomedia.createNewFile();
} catch (IOException e) {
}
return filePath;
} }
//┏┓   ┏┓
//┏┛┻━━━┛┻┓
//┃       ┃  
//┃   ━   ┃
//┃ ┳┛ ┗┳ ┃
//┃       ┃
//┃   ┻   ┃
//┃       ┃
//┗━┓   ┏━┛
//┃   ┃ 神兽保佑        
//┃   ┃ 代码无BUG。
//┃   ┗━━━┓
//┃       ┣┓
//┃       ┏┛
//┗┓┓┏━┳┓┏┛
// ┃┫┫ ┃┫┫
// ┗┻┛ ┗┻┛

Demo 下载地址:  http://download.csdn.net/detail/aaawqqq/7653475

祝福大家每日精进

谢谢

Android Camera 拍照 三星BUG总结的更多相关文章

  1. android Camera拍照 及 MediaRecorder录像 预览图像差90度

    Camera拍照: 今天做照相机程序,结果写好了发现出问题了,预览的图像差90度.相关源代码如下: Camera.Parameters params = camera.getParameters(); ...

  2. Android Camera拍照 压缩

    http://www.linuxidc.com/Linux/2014-12/110924.htm package com.klp.demo_025; import java.io.ByteArrayI ...

  3. Android开发技巧——Camera拍照功能

    本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...

  4. [置顶] android系统如何在静音模式下关闭camera拍照声音(2)

    之前写过一篇“android系统如何在静音模式下关闭camera拍照声音”的博客,今天来写他的续篇,继续探讨这个问题. 公司新需求,要求在camera应用中添加一个开关,可以进行拍照声音的关闭和开启. ...

  5. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  6. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  7. Android 修改Camera拍照的默认保存路径

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  8. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  9. Android选择/拍照 剪裁 base64/16进制/byte上传图片+PHP接收图片

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/65633129认为博文实用,请点赞,请评论,请关注.谢谢! ~ 老规矩,先上GIF动态图 ...

随机推荐

  1. python爬虫(爬取段子)

    python爬取段子 爬取某个网页的段子 第一步 不管三七二十一我们先导入模块 #http://baijiahao.baidu.com/s?id=1598724756013298998&wfr ...

  2. LeetCode(136) Single Number

    题目 Given an array of integers, every element appears twice except for one. Find that single one. Not ...

  3. mysql slow 分析工具

    慢查询有什么用?         它能记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化. 测试用 MySQL 版本.   Serv ...

  4. Thymeleaf模板引擎+Spring整合使用方式的介绍

    尊重原创,原文地址为:https://www.cnblogs.com/jiangchao226/p/5937458.html 前言 这个教程介绍了Thymeleaf与Spring框架的集成,特别是Sp ...

  5. 三、harbor部署之SSL

    1 签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名证书:由服务器自己颁发给自己,用于证明自己身份的东西,非权威颁发机构发布. 2 openssl简介 ...

  6. 【原】缓存之 HttpRuntime.Cache

    1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...

  7. “玲珑杯”ACM比赛 Round #18

    “玲珑杯”ACM比赛 Round #18 Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00 A -- 计算几何你瞎暴力 Time ...

  8. zoj2112 主席树动态第k大 (主席树&&树状数组)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  9. iOS阴影

    但是如果把masksToBounds设置为yes就没有阴影了     UIButton *view = [[UIButton alloc]initWithFrame:CGRectMake(, , ,  ...

  10. Kubernetes对象

    Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式 ...