文档章节

Android 相机开发 三星拍照崩溃修改解决 详细

luhang
 luhang
发布于 2017/02/09 13:27
字数 1355
阅读 383
收藏 0
点赞 0
评论 0

android 相机调用问题

三星系统4.0以上, 调用系统相机屏幕会强制切换为横屏 拍照完会切换为竖屏 点击保存回Activity 程序会直接崩溃 :


我理解的是

android系统在手机切换横竖屏的时候会把当前的activity销毁掉 然后又重新执行Oncreat方法 activity中设置得静态变量,所有的类变量居然都变成了空,而且在返回activity时重新执行oncreate(),由于变量都被回收,所以造成了空指针,目前解决方法也仅仅是在本activity中得变量在onSaveInstanceState()存储

开始贴代码

布局文件1:

 <activity调用相机的类
            android:name="com.example.camera.MainActivity"
            android:label="@string/app_name"
            <--这个在所有调用相机的类里都要设置->
            android:configChanges="screenSize|keyboardHidden|orientation"    
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity    中间类不绘制布局
            android:name="com.example.camera.UseCameraActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|navigation"
            android:launchMode="singleTop"
            android:screenOrientation="portrait" />

布局文件2:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >




        <LinearLayout  android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >


            <LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:padding="15dp" >


                <ImageView  android:id="@+id/btn_real_name_authentication_add_id_card_front" android:layout_width="wrap_content" android:layout_height="100dp" android:layout_marginRight="10dp" android:layout_weight="1" android:src="@drawable/add_id_card_1" />


                <ImageView  android:id="@+id/btn_real_name_authentication_add_id_card_side" android:layout_width="wrap_content" android:layout_height="100dp" android:layout_marginLeft="10dp" android:layout_weight="1" android:src="@drawable/add_id_card_1" />
            </LinearLayout>


            <LinearLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:gravity="center" android:padding="15dp" >


                <ImageView  android:id="@+id/btn_bank_front" android:layout_width="match_parent" android:layout_height="100dp" android:layout_marginRight="10dp" android:layout_weight="1" android:src="@drawable/add_id_card_1" />


                <ImageView  android:id="@+id/btn_bank_side" android:layout_width="match_parent" android:layout_height="100dp" android:layout_marginLeft="10dp" android:layout_weight="1" android:src="@drawable/add_id_card_1" />
            </LinearLayout>


        </LinearLayout>


</LinearLayout>

相机调用中间类

/** * 照片生成的目录在 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;
}
/*public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK&& event.getAction() == KeyEvent.ACTION_DOWN){ Intent inte =new Intent(UseCameraActivity.this, MainActivity.class); startActivity(inte); return true; } return super.onKeyDown(keyCode, event); }*/
}

---------

然后是调用相机显示照片的activity

/** * 启动界面 * * 照片生成的目录在 sd卡的/a/image/camera/.. .jpg * * @author baozi * */
public class MainActivity extends Activity implements OnClickListener{


private Bitmap bitmaps;

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;
private  ImageView lifttob,righttob,rightbom,liftbom;
private int volue =0;
protected static final int ADD_ID_CARD_FRONT = 101;
protected  static final int ADD_ID_CARD_SIDE = 102;
protected static final int ADD_BANK_FRONT = 103;
protected static final int ADD_BANK_SIDE = 104;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContentResolver = getContentResolver();
//判断 activity被销毁后 有没有数据被保存下来
if (savedInstanceState != null) {

volue =savedInstanceState.getInt("volue");

Log.i("123---savedInstanceState", "图片拍摄成功");
finish();
} else {
Log.i("123---savedInstanceState", "图片拍摄失败");
}
init();
}

private void init(){
lifttob = (ImageView) findViewById(R.id.btn_real_name_authentication_add_id_card_front);
righttob = (ImageView) findViewById(R.id.btn_real_name_authentication_add_id_card_side);
liftbom = (ImageView) findViewById(R.id.btn_bank_front);
rightbom = (ImageView) findViewById(R.id.btn_bank_side);
lifttob.setOnClickListener(this);
righttob.setOnClickListener(this);
rightbom.setOnClickListener(this);
liftbom.setOnClickListener(this);

}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
//按钮启动相机 volue赋值
case R.id.btn_real_name_authentication_add_id_card_front:
volue=1;
Intent intent = new Intent(MainActivity.this,
UseCameraActivity.class);
startActivityForResult(intent, ADD_ID_CARD_FRONT);
break;
case R.id.btn_real_name_authentication_add_id_card_side:
volue =2;
Intent intent1 = new Intent(MainActivity.this,
UseCameraActivity.class);
startActivityForResult(intent1, ADD_ID_CARD_SIDE);
break;
case R.id.btn_bank_front:
volue =3;
Intent intent2 = new Intent(MainActivity.this,
UseCameraActivity.class);
startActivityForResult(intent2, ADD_BANK_FRONT);
break;
case R.id.btn_bank_side:
volue =4;
Intent intent3 = new Intent(MainActivity.this,
UseCameraActivity.class);
startActivityForResult(intent3, ADD_BANK_SIDE);
break;


default:
break;
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case ADD_ID_CARD_FRONT:
if(volue==1){
String path = data.getStringExtra(UseCameraActivity.IMAGE_PATH);
Log.i("123", path);

// 根据照片的位置获取图片
Bitmap bitmap = getBitmap(path);
Drawable dra = new BitmapDrawable(bitmap);
lifttob.setImageBitmap(bitmap);
}
break;


case ADD_ID_CARD_SIDE:
if(volue==2){
String path1 = data.getStringExtra(UseCameraActivity.IMAGE_PATH);
Bitmap bitmap1 = getBitmap(path1);
righttob.setImageBitmap(bitmap1);
}


case ADD_BANK_FRONT:
if(volue==3){
String path2 = data.getStringExtra(UseCameraActivity.IMAGE_PATH);
Bitmap bitmap2 = getBitmap(path2);
liftbom.setImageBitmap(bitmap2);
}
case ADD_BANK_SIDE:
if(volue==4){
String path3 = data.getStringExtra(UseCameraActivity.IMAGE_PATH);
Bitmap bitmap3 = getBitmap(path3);
rightbom.setImageBitmap(bitmap3);
}
break;


default:
super.onActivityResult(requestCode, resultCode, data);
break;
}


}


@Override 
    public void onConfigurationChanged(Configuration newConfig)
    { 
        super.onConfigurationChanged(newConfig); 
    /* if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { //land } else*/ if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
     {

//port
     }
    }


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();

//根据图片尺寸设置屏幕显示大小 o2.inSampleSize = scale; 也可以设置固定值 比如10
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;
}



//存入调用相机设置的volue值 为了防止图片设置重复
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("volue", volue );
}

}

demo下载地址: http://download.csdn.net/detail/qq_18413391/9557122

有问题欢迎学习交流,私信留言,共同学习

© 著作权归作者所有

共有 人打赏支持
luhang
粉丝 3
博文 15
码字总数 571
作品 0
长宁
程序员
三星S9+评测:没有跟风「刘海」,却依然稳坐机皇宝座

2018年注定将是被「刘海」统治的一年,主流厂商纷纷押注异形全面屏,意味着消费者将越来越难看到「不一样」造型的新机。然而总有几家厂商保持理性,三星便没有去刻意追求这种视觉上的「极致」...

雷科技 ⋅ 03/14 ⋅ 0

android相机拍照

1、系统权限 <uses-permission android:name="android.permission.CAMERA"></uses-permission> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="and......

风过后 ⋅ 2016/04/12 ⋅ 0

Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho ⋅ 05/30 ⋅ 0

调用系统相机,相册功能

一开始的思路是这一块的功能单独出去;这样处理又会碰见很多问题. 还是集成在Activity中可能效果更好些, 而且三星的手机调用系统相机会导致调用的Activity会重启生命周期,如果是在fragment中调...

新年 ⋅ 2015/05/06 ⋅ 0

Android 新老两代 Camera API 大起底

0.背景简介 最近有一部分相机相关的需求,专注于对拍摄的照片、视频的噪点、色温、明暗等方面进行优化。一般我们在生活中使用相机来拍照的话,在前期拍摄时,就可以通过调整相机的拍摄参数,...

byeweiyang ⋅ 05/30 ⋅ 0

Android学习笔记系列一 —— 组件的类型

1.Activity 可以单纯的理解为一个页面就是一个Activity。他与用户的交互息息相关,每个Activity在程序中其实是相互独立的,这样带来的好处就是,一个Activity可以被自己所在的程序调用,也可...

微笑的江豚 ⋅ 2016/03/18 ⋅ 0

你需要知道的Android拍照适配方案

你需要知道的Android拍照适配方案 字数4229 阅读4284 评论23 喜欢71 声明:本文作者授权微信公众号Android程序员(AndroidTrending)在微信公众号平台原创首发。 近段时间,家里陪自己度过大...

3kqing ⋅ 2016/06/05 ⋅ 0

数码相机会成为 Android 的下一个目标么?

在刚刚结束的发布会上,三星发布了一款支持3G、4G和Wi-Fi的Android智能相机。 这款名叫Galxy Camera的智能相机搭载最新的Android 4.1系统,21倍变焦、23mm超广角镜头,搭载1600万像素背照式C...

oschina ⋅ 2012/08/30 ⋅ 42

Android 定制系统 - MIUI

MIUI是小米科技推出的一款基于CyanogenMod而深度定制的Android移动操作系统,从Android 4.0开始,已经完全脱离CyanogenMod而改为基于原厂ROM的定制方式,中文名称为“米柚”。它大幅修改了A...

匿名 ⋅ 2013/01/10 ⋅ 0

这年头,鸡都开始用VR改善生活了,你呢?!活得还不如一只鸡....

科技你好 关注我们·成为科技潮人 今天!!! 技哥受到了鸡的挑衅 突然感觉 人生不如鸡生~ 因为 鸡都戴着VR到处跑 为了吃到美味的鸡肉 美国大学教授开展了一项宏伟计划 ▼▼▼ VR+鸡 即通过V...

m7720eiosi6oa9 ⋅ 03/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 15分钟前 ⋅ 1

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 40分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 44分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部