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. perl学习之:肯定匹配和否定匹配

    tr/ / / 替换操作符不支持正则表达式 也不具备双引号替换能力m/ /  s/ / / 都支持正则表达式,并且可以提供或限制双引号替换能力 $string = "25abc8" ...

  2. python--前端CSS

    一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义了如何显示HTML元素,给HTML设置样式,让他更加美观. 当浏览器读到这个样式表, 他就会按照这个样式来对文档进行 ...

  3. python-leepcode-作用解析 - 5-27

    30 找不同 给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "a ...

  4. 咕咕咕,skkyk的博客生活从此开始了

    2019-5-9 咕咕咕,skkyk的博客生活从此开始了 我是划水时长两个半小时的个人OIer skkyk,我喜欢打表,暴零,骗分,瞎搞(律师函警告); 2019-6-14 中考结束的第二天 我们苦逼 ...

  5. 【javascript面试题】5个经典的面试题

    问题1: 作用域 看一下下面的代码: (function(){ var a = b =5; })(); console.log(b); 结果会输出什么? 答案: 5 这个问题考查的要点是两个不同的作用 ...

  6. ntdsutil 清理弃用服务器-----待验证

    例子是这样的: 一个森林里有两个树,mm.com和cc.com,分别有dc www.mm.com和vdc.cc.com, cc.com域的控制器崩溃,不想恢复,要彻底删除这个域,由于vdc.cc.co ...

  7. PTA 07-图6 旅游规划 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划   (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...

  8. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用[转]   spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...

  9. iOS开发工具篇-AppStore统计工具

    苹果官方的iTunes Connect提供的销售数据统计功能比较弱,例如只能保存最近30天的详细销售数据,界面丑陋, 无法查看App的排名历史变化情况等. 早有一些公司提供了专门的解决方案或工具.这些 ...

  10. 算法复习——虚树(消耗战bzoj2286)

    题目: Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战 ...