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

news/2025/1/11 1:33:36/

     android 相机调用问题   

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

 我理解的是:android系统在手机切换横竖屏的时候会把当前的activity销毁掉  然后又重新执行Oncreat方法  

 activity中设置得静态变量,所有的类变量居然都变成了空,而且在返回activity时重新执行oncreate(),由于变量都被回收,所以造成了空指针,目前解决方法也仅仅是在本activity中得变量在onSaveInstanceState()存储

这两天搜索网上的答案,找到很好的例子,然后我又重新整合了一下   多张连拍显示     可运行各个手机型号  暂时没发现BUG

开始贴代码

 <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" />


布局文件

<?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>




相机调用中间类

package com.example.camera;


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;
import android.view.KeyEvent;


/**
 *
照片生成的目录在 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

package com.example.camera;


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.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
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 android.widget.TextView;


import com.example.camerabaozi.R;
import com.nostra13.universalimageloader.core.ImageLoader;


/**
 * 启动界面
 * 
 * 照片生成的目录在 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




   


http://www.ppmy.cn/news/380941.html

相关文章

android 三星手机拍照旋转90度,解决三星拍照上传照片被旋转90度,和三星相机崩溃...

刚刚想起来前几天面试的时候遇到的一个问题&#xff0c; 问题大概是这样的做拍照上传图片功能的时候&#xff0c;在三星手机上拍出的照片是旋转了90度的&#xff0c;应该如何解决这个问题。因为之前没有遇到过这种问题&#xff0c;当时我回答的是给图片做一个ObjectAnimator的r…

Android-相机

开发学习记录 1、调用相机拍照 private fun takePhotoThumb() {Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->takePictureIntent.resolveActivity(packageManager)?.also {startActivityForResult(takePictureIntent, requestTakeThumbCode)}}} …

android 三星调用拍照功能吗,详解三星GALAXY Camera超方便的拍照功能

1自动模式很省心 轻松拍摄不用愁 三星GALAXY Camera可以算是一款非常革命性的产品&#xff0c;将传统的小尺寸长焦机与高性能的4核心移动设备融合起来也算得上是史无前例的事情。当然了如果只是用史无前例来形容的话那么大家肯定会怀疑笔者是不是在吹牛皮&#xff0c;所以我们就…

三星是android吗,三星 Galaxy Camera(三星安卓相机)

三星 Galaxy Camera(三星安卓相机) 编辑 锁定 上传视频 三星GALAXY Camera 集成高性能的拍摄技术&#xff0c;搭载最新的 Android 4.1 果冻豆操作系统&#xff0c;支持无线网络连接功能&#xff0c;开创了终端产品新类型。 中文名 三星 Galaxy Camera(三星安卓相机) 型 号 G…

新一代相机传感器,三星Isocell HP3,更小像素更智能?

三星的Isocell HP3图像传感器比其前身具有更小的像素和更智能的自动对焦。 三星周四推出了用于智能手机相机的最新200MP图像传感器。 Isocell HP3包含2亿个0.56微米大小的像素&#xff0c;比去年推出的首款2000万像素图像传感器Isocell HP1中使用的0.64微米大小的像素小12%。 …

TypeScript 第一章

欢迎来到 TypeScript 学习&#xff01;本章将为您介绍 TypeScript 的基础知识。 TypeScript 是 JavaScript 的一个超集&#xff0c;它提供了静态类型检查、类、接口等特性&#xff0c;使得编写大型应用程序变得更加容易和可维护。TypeScript 编写的代码可以被编译成 JavaScript…

Flink TableAPI Aggregation And DataType

序言 这里整理下聚合的优化选项 以及 数据类型 Stream Aggregation SQL 是数据分析中使用最广泛的语言。Flink Table API 和 SQL 使用户能够以更少的时间和精力定义高效的流分析应用程序。此外&#xff0c;Flink Table API 和 SQL 是高效优化过的&#xff0c;它集成了许多查询…

企企通联合创始人兼总架构师杨华:剖析SRM顾问长期主义项目实践

近日&#xff0c;国产大飞机C919商业首飞成功引起广泛关注&#xff0c;此后&#xff0c;我们的出行选择中新增了一项“自己国家的大飞机”&#xff0c;给国人带来了更多的期待和自豪。 走难而正确的路&#xff0c;国产大飞机C919从项目立项到“一飞冲天”&#xff0c;花了十六年…