基于Android的拍照上传程序开发
基于Android的拍照上传程序开发
大家好,我是PETER(cfwdl)。写这篇文章是为了帮助以前没有没有接触过anroid或是刚刚入门并没有摸过手机的硬件设备监测、使用等功能的朋友,给大家一个我自己的写的心得和经验,我也是新手,所以大家互相交换一下经验吧。当然每个程序都会有问题,因为我不是最终用户,软件的测试工作没有好好测试过,大家凑合看看吧~!
程序介绍:
本程序主要完成一个煎蛋的android手机拍照程序(本程序的拍照功能比较简单,没有添加处理图像、手机自动对焦等功能,如果有需要的朋友可以自行参考一下相关linstener或action的资料)
主功能:手机拍照、拍照预览、图片的存储、图片资料编辑、图像上传等功能
其他相关需求:监测手机网络状态、监测手机GPS状态、获取GPS位置、获取基站位置等。
需求分析:
(程序流程)
正如上图所示,我大致的画了一下这个程序的简单的工作流程。
那么,各位看官们,现在开始我们的程序开发之旅吧。
程序设计:
PS:本人不是美工,所以界面肯定灰常粗糙,不过不影响我们展示功能~!大家权且凑合继续看
主界面(camera_surface.xml):
本界面使用AbsoluteLayout布局来设计该界面,
下面的代码中我定义了一个全屏的SurfaceView用来在我们进入程序的第一个界面(就是拍照界面),
一个ID为nowLocality的TextView,来动态的刷新用户手机当前获取到的位置信息。
三个Button 分别是:拍照、上传、退出这个大概不用我再啰嗦了。
<?xmlversion="1.0"encoding="utf-8"?>
<AbsoluteLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<SurfaceViewandroid:id="@+id/surface_camera"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
</SurfaceView>
<TextView
android:id="@+id/nowLocality"
android:layout_x="10px"
android:layout_y="25px"
android:textColor="@color/red"
android:textSize="14px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在获取当前位置"
/>
<Buttonandroid:text="拍照"
android:layout_x="360px"
android:layout_y="20px"
android:drawableLeft="@drawable/ic_menu_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/paizhao"
/>
<Buttonandroid:text="上传"
android:drawableLeft="@drawable/ic_menu_upload_mini"
android:textSize="16px"
android:layout_x="360px"
android:layout_y="70px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/uploadPhoto"
/>
<Buttonandroid:text="退出"
android:textSize="16px"
android:drawableLeft="@drawable/ic_menu_revert_mini"
android:layout_x="360px"
android:layout_y="120px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/exitPro"/>
</AbsoluteLayout>
对应本界面的程序代码(MainPage.java):
程序的相关部分我都已经添加了注释,大概的功能各位应该都可以看明白,流程就是按onCreate()里的顺序执行下来。
packagecom.bjwmt.camera;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.Dialog;
importandroid.app.ProgressDialog;
importandroid.content.ComponentName;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.pm.ActivityInfo;
importandroid.database.Cursor;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.PixelFormat;
importandroid.hardware.Camera;
importandroid.hardware.Camera.AutoFocusCallback;
importandroid.hardware.Camera.PictureCallback;
importandroid.hardware.Camera.ShutterCallback;
importandroid.location.Criteria;
importandroid.location.Location;
importandroid.location.LocationListener;
importandroid.location.LocationManager;
importandroid.net.ConnectivityManager;
importandroid.net.NetworkInfo;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Looper;
importandroid.os.Message;
importandroid.telephony.TelephonyManager;
importandroid.text.Html;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.SurfaceHolder;
importandroid.view.SurfaceView;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.TextView;
publicclassMainPageextendsActivity implementsSurfaceHolder.Callback,
OnClickListener{
/**
* 程序存放的图片路径是在/sdcard/fatalityUpload这个文件夹
*/
privateSurfaceViewmSurfaceView;
privateCameramCamera;
privateSurfaceHoldermSurfaceHolder;
privatebooleanmPreviewRunning;
privateTextViewnowLocality;
privateButtonexitButton;
privateButtonuploadButton;
privateButtonpaizhaoButton;
// 实例化一个TelephonyManager 创建android的电话管理
privateTelephonyManagertm;
privateDatetoday;
privateSimpleDateFormatsdf = newSimpleDateFormat("yyyyMMddhhmmss");
privateStringfileName;
privateStringlat = "", lng = "";// 经度和纬度
privateStringlatLongString;
privateGpsThreadgpsThread;
privateDBHelperdbHelper;
privateCursorcursor;
/**
* 本界面的主函数
*/
@Override
publicvoidonCreate(BundlesavedInstanceState) {
checkMysoftStage();
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_surface);
// 摄像头界面将通过全屏显示,没有"标题(title)";
getWindow().setFormat(PixelFormat.TRANSLUCENT);
//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
//WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
this.initMyCamera();
}
/**
* 检查一下手机设备各项硬件的开启状态
*/
publicvoidcheckMysoftStage(){
/*
* 先看手机是否已插入sd卡 然后判断sd卡里是不是已经创建了fatalityUpload文件夹用来存储本程序拍下来的照片
* 如果没有创建的话就重新在sdcard里创建fatalityUpload文件夹
*/
if(existSDcard()) { //判断手机SD卡是否存在
if (newFile("/sdcard").canRead()) {
File file = newFile("sdcard/fatalityUpload");
if(!file.exists()) {
file.mkdir();
file = newFile("sdcard/fatalityUpload/Thumbnail_fatality");
file.mkdir();
file = newFile("sdcard/fatalityUpload/fatality");
file.mkdir();
}
}
} else {
newAlertDialog.Builder(this).setMessage("检查到没有存储卡,请插入手机存储卡再开启本应用")
.setPositiveButton("确定",
newDialogInterface.OnClickListener() {
public void onClick(
DialogInterfacedialoginterface, int i) {
finish();
}
}).show();
}
/*
* 此处开始初始化数据库
try{
dbHelper = newDBHelper(this);
dbHelper.open(this);
cursor= dbHelper.loadAll();
if(!(cursor!=null&& cursor.getCount()>0)){
dbHelper.initData();
}
cursor.close();
dbHelper.close();
}catch (Exception e) {
Log.d("savedata", "save data fail");
}finally {
this.dbHelper.close();
}
*/
ConnectivityManagerconnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfonetworkinfo = connectivityManager.getActiveNetworkInfo();
if(networkinfo == null || !networkinfo.isAvailable()) { // 当前网络不可用
newAlertDialog.Builder(MainPage.this)
.setMessage("检查到没有可用的网络连接,请打开网络连接")
.setPositiveButton("确定",
newDialogInterface.OnClickListener(){
publicvoid onClick(DialogInterface dialoginterface, int i){
ComponentNamecn = newComponentName("com.android.settings","com.android.settings.Settings");
Intent intent =new Intent();
intent.setComponent(cn);
intent.setAction("android.intent.action.VIEW");
startActivity(intent);
// finish();
}
}
).show();
}
}
/**
* 初始化组件
*/
public voidinitMyCamera() {
setListensers();
//TelephonyManager是android的电源通讯的帮助类,通过实例化TelephonyManager来实现操作类似获取本机
// IME码,手机号等信息
tm =(TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
// 初始化拍摄模块
mSurfaceView =(SurfaceView) findViewById(R.id.surface_camera);
//mSurfaceView.setOnClickListener(this);
mSurfaceHolder =mSurfaceView.getHolder();
mSurfaceHolder.addCallback(MainPage.this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
gpsThread = newGpsThread();
gpsThread.start();
// 设置监听器,自动更新的最小时间为间隔1秒,最小位移变化超过3米
//mLocationManager.requestLocationUpdates(provider, 1000, 3,
//locationListener);
}
/**
* 此函数负责两个工作 1.实例化屏幕上的按钮 2.为按钮添加Listener
*/
private voidsetListensers() {
nowLocality =(TextView) findViewById(R.id.nowLocality);
exitButton =(Button) findViewById(R.id.exitPro);
uploadButton =(Button) findViewById(R.id.uploadPhoto);
paizhaoButton =(Button) findViewById(R.id.paizhao);
exitButton.setOnClickListener(clickExitButton);
uploadButton.setOnClickListener(clickUploadButton);
paizhaoButton.setOnClickListener(clickShootButton);
}
/**
* 当预览界面的格式和大小发生改变时,该方法被调用
*/
public voidsurfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if(mPreviewRunning) {
mCamera.stopPreview();
}
Camera.Parametersp = mCamera.getParameters();
p.setPreviewSize(w,h);
mCamera.setParameters(p);
try {
mCamera.setPreviewDisplay(holder);
} catch(IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
mPreviewRunning= true;
}
/**
* 重点函数 此处实例化了本界面的PictureCallback
* 当用户拍完一张照片的时候触发onPictureTaken,这时候对拍下的照片进行相应的处理操作
*/
PictureCallbackmPictureCallback = new PictureCallback() {
public voidonPictureTaken(byte[] data, Camera camera) {
if (data !=null) {
try {
today = newDate();
// 定义fileName 用来设定拍照后的文件名
// 结构: IMSI号 + 经度+ & + 纬度+ 格式化后的当前时间 (本来结构应该是 手机号 + 精度&纬度 + 格式化后的当前时间)但是因为手机号有获取不到的情况,所以换为了IMSI号
fileName =tm.getDeviceId() + "-" + lat + "-" + lng
+ "-"+ sdf.format(today); //tm.getLine1Number()获取手机号,这里直接是获取不到的,需要运营商的API解析
Bitmap bm =BitmapFactory.decodeByteArray(data, 0,
data.length);
BufferedOutputStreambos = new BufferedOutputStream(
newFileOutputStream(String.format(
"sdcard/fatalityUpload/fatality/"
+ fileName +".jpg", System
.currentTimeMillis())));
bm.compress(Bitmap.CompressFormat.JPEG,60, bos);
bos.flush();
bos.close();
BufferedOutputStreambos1 = new BufferedOutputStream(
newFileOutputStream(String.format(
"sdcard/fatalityUpload/Thumbnail_fatality/"
+ fileName +".jpg", System
.currentTimeMillis())));
Bitmap bm1 =Bitmap.createScaledBitmap(bm, 100, 100, false);
bm1.compress(Bitmap.CompressFormat.JPEG,100, bos1);
bos1.flush();
bos1.close();
removeDialog(0);
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
//bm.compress(Bitmap.CompressFormat.PNG, 30, baos);
// byte[]newData = baos.toByteArray();
// 然后传递图片信息到 图像预览界面
Intent intent =new Intent();
Bundle bundle =new Bundle();
//bundle.putByteArray("picPre", newData);
bundle.putString("picPath",
"/sdcard/fatalityUpload/fatality/"+ fileName
+".jpg");
//intent.putExtra("picPre", data);
intent.putExtras(bundle);
intent.setClass(MainPage.this,PhotoPreview.class);
// if(mLocationManager != null) {
//mLocationManager.removeUpdates(locationListener);
// }
if(!gpsThread.isInterrupted()){
gpsThread.stopGspListener();
gpsThread.interrupt();
}
finish();
startActivity(intent);
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
}
};
/**
* 创建Camera对象函数 初次实例化,界面打开时该方法自动调用
*/
public voidsurfaceCreated(SurfaceHolder holder) {
// ThreadopenCameraThread = new Thread(
// newRunnable() {
// public voidrun() {
// mCamera =Camera.open();
// }
// }
// ).start();
mCamera =Camera.open();// “打开”摄像头
}
/**
* 当用户进行 点击 操作的时候触发此事件,不过貌似没有起作用,有待测试
*/
public voidonClick(View v) {
mCamera.takePicture(mShutterCallback,null, mPictureCallback);
}
/**
* 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
* 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 例如:使设备震动
*/
ShutterCallbackmShutterCallback = new ShutterCallback() {
public voidonShutter() {
// just log ,donothing
Log.d("ShutterCallback","...onShutter...");
}
};
//PictureCallback rowCallback = new PictureCallback(){
// public voidonPictureTaken(byte[] data, Camera camera) {
//
// }
// };
/**
* 销毁函数 当预览界面被关闭时,该方法被调用
*/
public voidsurfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mPreviewRunning= false;
mCamera.release();
mCamera = null;
}
/*
* 点击屏幕上的"退出"键时触发该Listener监听此按钮的动作
*/
privateOnClickListener clickExitButton = new OnClickListener() {
public voidonClick(View v) {
new AlertDialog.Builder(MainPage.this).setTitle("提示").setMessage(
"确定退出?").setPositiveButton("确定",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
// if(mLocationManager != null) {
//mLocationManager
//.removeUpdates(locationListener);
// }
if(!gpsThread.isInterrupted()){
gpsThread.stopGspListener();
gpsThread.interrupt();
}
finish();
}
}).setNegativeButton("取消",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
// 取消按钮事件
}
}).show();
}
};
/*
* 点击屏幕上的"上传"键时触发该Listener监听此按钮的动作
*/
privateOnClickListener clickUploadButton = new OnClickListener() {
public voidonClick(View v) {
Intent intent =new Intent();
intent.setClass(MainPage.this,PictrueView.class);// PhotoView
// if(mLocationManager != null) {
//mLocationManager.removeUpdates(locationListener);
// }
if(!gpsThread.isInterrupted()){
gpsThread.stopGspListener();
gpsThread.interrupt();
}
finish();
startActivity(intent);
}
};
/*
* 点击屏幕上的"拍照"键时触发该Listener监听此按钮的动作
*/
privateOnClickListener clickShootButton = new OnClickListener() {
public voidonClick(View v) {
showDialog(0);
mCamera.takePicture(mShutterCallback,null, mPictureCallback);
}
};
// 声明三个menu键带出来的按钮
public staticfinal int ITEM_1_ID = Menu.FIRST;
public staticfinal int ITEM_2_ID = Menu.FIRST + 1;
public staticfinal int ITEM_3_ID = Menu.FIRST + 2;
// 初始化Menu菜单,用户按下menu键时自动触发
public booleanonCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0,ITEM_1_ID, 0, "设置");
menu.add(0,ITEM_2_ID, 1, "关于");
menu.add(0,ITEM_3_ID, 2, "退出");
return true;
}
/**
* 处理用户按下menu键时的操作
*/
public booleanonOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case 1: // 调出系统设置界面
ComponentName cn= new ComponentName("com.android.settings",
"com.android.settings.Settings");
Intent intent =new Intent();
intent.setComponent(cn);
intent.setAction("android.intent.action.VIEW");
startActivity(intent);
return true;
case 2: // 关于
showDialog(1);
return true;
case 3: // 退出
newAlertDialog.Builder(this).setTitle("提示").setMessage("确定退出?")
.setPositiveButton("确定",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
setResult(RESULT_OK);//确定按钮事件
// if(mLocationManager != null) {
//mLocationManager
//.removeUpdates(locationListener);
// }
if(!gpsThread.isInterrupted()){
gpsThread.stopGspListener();
gpsThread.interrupt();
}
finish();
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener(){
public voidonClick(DialogInterface dialog,
int whichButton){
// 取消按钮事件
}
}).show();
return true;
}
return false;
}
/**
* 当用户按下手机实体按键时触发 如果按下的是拍照键的话返回一个true,其他都是false
*/
@Override
public booleanonKeyDown(int keyCode, KeyEvent event) {
if (keyCode ==KeyEvent.KEYCODE_CAMERA) {
returnsuper.onKeyDown(keyCode, event);
} else
return false;
}
/**
* 判断存储卡是否存在
*
* @return
*/
public booleanexistSDcard() {
if(android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)){
return true;
} else
return false;
}
/**
* 相机自动对焦函数
*/
AutoFocusCallbackautoFocusCallback = new AutoFocusCallback() {
public voidonAutoFocus(boolean success, Camera camera) {
}
};
@Override
protected DialogonCreateDialog(int id) {
switch (id) {
case 1: {
return newAlertDialog.Builder(MainPage.this)
.setIcon(R.drawable.ic_menu_info_details)
.setTitle("关于拍照上传软件")
.setMessage(
Html.fromHtml("<fontcolor=#E43E07 >程序功能介绍:</font><p>本程序用于图片拍摄及上传图片等功能</p>"
+ "<fontcolor=#E43E07 >注意:</font><p>使用本程序前,请先开启用户手机的GPS及无线网络。(拍照界面中点击 menu键->设置->安全与位置/无限网络 开启GPS及无限网络)</p>"
+ "<palign=center color=#767676 size=12px>PETER制作 版权所有</p>"))
.setPositiveButton("确定",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
removeDialog(1);
}
}).create();
}
case 0: {
ProgressDialogdialog = new ProgressDialog(this);
dialog.setMessage("处理中,请稍后...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
return dialog;
}
}
return null;
}
HandlermyHandler = new Handler() {
publicvoid handleMessage(Message msg) {
switch(msg.what) {
case0:
Bundlebundle = msg.getData();
// Log.d("Thread Test","<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<handlerget message"+msg.what);
lat= bundle.getString("lat");
lng= bundle.getString("lng");
latLongString= bundle.getString("latLongString");
// Log.d("handler Text","<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"+latLongString+"lat:"+lat+" lng:"+lng);
nowLocality.setText(System.currentTimeMillis()+ ":\n" + latLongString);
break;
case1:
AlertDialogdialog1 = new AlertDialog.Builder(MainPage.this)
.setTitle("提示").setMessage(
"检测到GPS/A-GPS没有开启\n 点击 确定 进入系统设置,点击 取消 结束").setPositiveButton("Ok",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
/*
* 转到设置界面
*/
Intent fireAlarm= new Intent(
"android.settings.LOCATION_SOURCE_SETTINGS");
fireAlarm
.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(fireAlarm);
}
}).setNegativeButton("取消",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
if(!gpsThread.isInterrupted()){
gpsThread.stopGspListener();
gpsThread.interrupt();
}
finish();
}
}).create();
dialog1.show();
break;
case2:
AlertDialogdialog2 = new AlertDialog.Builder(MainPage.this)
.setTitle("提示").setMessage("无法获得当前位置,稍后将会重试")
.setPositiveButton("Ok",
newDialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog,
int whichButton){
// finish();
}
}).create();
dialog2.show();
break;
}
super.handleMessage(msg);
}
};
/**
* 手机的GPS线程
* @author peter
*/
class GpsThreadextends Thread implements Runnable {
privateLooper mLooper;
privateLocationManager mLocationManager;
private Locationlocation;
private Messagemessage;
private longpreTime;
StringlatLongStr = "",latitude = "",longitude = "";
public LoopergetLooper() {
returnmLooper;
}
public voidquit() {
mLooper.quit();
}
private voidupdateWithNewLocation(Location slocation) {
if(slocation != null) {
latitude= Double.toString(slocation.getLatitude());
longitude= Double.toString(slocation.getLongitude());
longsubTime = (System.currentTimeMillis() - preTime) / 1000;
floatv = (subTime == 0 || location == null) ? 0 : (location
.distanceTo(slocation)/ subTime);
latLongStr= "纬度:" + latitude +"\n经度:" + longitude + "\n速度:" + v
+" m/s , " + v * 3.6 + " km/h";
location= slocation;
preTime= System.currentTimeMillis();
}else {
latLongStr= "无法获取地理信息";
}
}
privateLocationListener locationListener = new LocationListener() {
// 底层获得的位置会通过这个接口上报给应用
public voidonLocationChanged(Location location) {
message.what =0;
updateWithNewLocation(location);
//Log.d("Thread Test", "*************************GPS ISOPEN!");
}
// Provider被disable时触发此函数,比如GPS被关闭
public voidonProviderDisabled(String provider) {
message.what =1;
//Log.d("Thread Test", "*************************GPS IS CLOSED!");
}
// Provider被enable时触发此函数,比如GPS被打开
public voidonProviderEnabled(String provider) {
}
/*
* 位置服务状态的变化通过这个接口上报
* Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
*/
publicvoidonStatusChanged(Stringprovider, intstatus, Bundle extras) {
message.what =2;
}
};
@SuppressWarnings("static-access")
publicvoidrun(){
Looper.prepare();
mLooper =Looper.myLooper();
// 此处实例化了 手机的本地位置服务 的一个对象
mLocationManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteriacriteria = newCriteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置为最大精度
criteria.setAltitudeRequired(false);//不要求海拔信息
criteria.setBearingRequired(false);//不要求方位信息
criteria.setCostAllowed(true);//是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW);//对电量的要求
Stringprovider = mLocationManager.getBestProvider(criteria, true);
while(!Thread.currentThread().isInterrupted()){
mLocationManager.requestLocationUpdates(provider,1000, 1, locationListener);
location= mLocationManager.getLastKnownLocation(provider);
// updateWithNewLocation(location); // 更新位置
while(location== null){
preTime= System.currentTimeMillis();
//刷新Provider信息
mLocationManager.requestLocationUpdates(provider,1000, 1, locationListener);
//获得最新的位置数据
location= mLocationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);// 更新位置
try{
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
try{
message = newMessage();
updateWithNewLocation(location);// 更新位置
Thread.sleep(4000);
} catch(InterruptedExceptione) {
e.printStackTrace();
}
//Log.d("Thread Test", "*************************Message.what'sValue is:"+message.what);
Bundledata = newBundle();
data.putString("latLongString",latLongStr);
data.putString("lat",latitude);
data.putString("lng",longitude);
message.setData(data);
myHandler.sendMessage(message);
}
Looper.loop();
}
publicvoidstopGspListener(){
if(mLocationManager!=null){
mLocationManager.removeUpdates(locationListener);
}
}
};
}
图像预览界面(photo_preview.xml):
当用户在主界面点击“拍照”后进入本界面,界面内容
一个ImageView展示刚刚用户拍下来的照片,
两个button“保存”和“放弃”
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableLayoutandroid:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="*"
android:background="@color/white"
>
<TableRow>
<ImageView
android:id="@+id/previewPic"
android:layout_width="wrap_content"
android:layout_height="235px"
/>
<!--
android:src="@drawable/javamylife"
-->
</TableRow>
<TableRow>
<TableLayoutandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="*"
android:background="@color/white"
>
<TableRow>
<Button
android:id="@+id/returnShoot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_menu_revert_mini"
android:gravity="center"
android:text="放弃"
/>
<Button
android:id="@+id/savePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_menu_save"
android:gravity="center"
android:text="保存"
/>
</TableRow>
</TableLayout>
</TableRow>
</TableLayout>
</LinearLayout>
程序代码(PictrueView.java):
packagecom.bjwmt.camera;
importjava.io.File;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.GridView;
importandroid.widget.AdapterView.OnItemClickListener;
publicclassPictrueViewextendsActivity{
privateList<String>phoList;
privatestaticImageAdaptermyImageAdapter;
publicvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.picture_view);
phoList= readFiles("sdcard/fatalityUpload/Thumbnail_fatality/");
GridViewgridview=(GridView)findViewById(R.id.picGridView);//找到main.xml中定义gridview的id
myImageAdapter= newImageAdapter(this,phoList);
gridview.setAdapter(myImageAdapter);//调用ImageAdapter.java
gridview.setOnItemClickListener(newOnItemClickListener(){//监听事件
publicvoidonItemClick(AdapterView<?>parent, View view, intposition, longid){
// myImageAdapter.getItemId(position);
StringfileArr[] = phoList.get(position).toString().split("/");
StringnewFilePath ="sdcard/fatalityUpload/fatality/"+fileArr[fileArr.length-1];
Intentintent = newIntent();
Bundleextras = newBundle();
extras.putString("prePath",newFilePath);
intent.putExtras(extras);
intent.setClass(PictrueView.this,SubmitPhoto.class);
finish();
startActivity(intent);
// Toast.makeText(PictrueView.this,""+position,Toast.LENGTH_SHORT).show();//显示信息;
}
});
}
@SuppressWarnings("unchecked")
privatestaticList<String>readFiles(String path) {
List picFiles =newArrayList();
// 构建文件对象
File dir = newFile(path);
// 得到改文件夹下所有文件
File[] files =dir.listFiles();
if(files!= null) {
for(inti =0; i < files.length; i++) {
String fileName= files[i].getName();
// 过滤所有后缀为.jpg的文件
if(fileName.lastIndexOf(".")> 0
&&fileName.substring(fileName.lastIndexOf(".") + 1,
fileName.length()).equals("jpg")){
picFiles.add(files[i].getPath());
}
}
}
returnpicFiles;
}
}
图像内容编辑上传界面:
<?xmlversion="1.0"encoding="UTF-8"?>
<ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TableLayoutandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="*"
>
<TableRow>
<Spinner
android:id="@+id/stationId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow>
<EditText
android:id="@+id/photoInfo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:lines="3"
android:singleLine="true"
android:text="图片信息"
/>
</TableRow>
<TableRow>
<ImageView
android:id="@+id/subPicImgView"
android:adjustViewBounds="true"
android:layout_width="wrap_content"
android:layout_height="300px"
/>
</TableRow>
<TableRow>
<TableLayoutandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="*"
>
<TableRow>
<Button
android:id="@+id/subButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_menu_upload_mini"
android:text="上传"
/>
<Button
android:id="@+id/returnMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_menu_revert_mini"
android:text="返回"
/>
</TableRow>
</TableLayout>
</TableRow>
</TableLayout>
</LinearLayout>
</ScrollView>
代码部分(SubmitPhoto.java):
packagecom.bjwmt.camera;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.net.URLConnection;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.net.ftp.FTP;
importorg.apache.commons.net.ftp.FTPClient;
importorg.apache.commons.net.ftp.FTPReply;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.Dialog;
importandroid.app.ProgressDialog;
importandroid.content.ComponentName;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.pm.ActivityInfo;
importandroid.database.Cursor;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.net.ConnectivityManager;
importandroid.net.NetworkInfo;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.telephony.TelephonyManager;
importandroid.text.Html;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.WindowManager;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ImageView;
importandroid.widget.Spinner;
publicclassSubmitPhotoextendsActivity{
privateButtonsubButton;
privateButtonreturnButton;
privateImageViewsubPicImgView;
privateBundlepreBundle;
privateMyThreadmyThread;
// privateSpinner stationSpinner;
privateDBHelperhelper;
privateCursorcursor;
privateList<StationModel>list = newArrayList<StationModel>();
// privateMyThread thread = new MyThread();
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.photo_submit);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
setListener();
Bitmap bitmap =getBitMap();
BitmapDrawablebmpDraw=newBitmapDrawable(bitmap);
subPicImgView.setImageDrawable(bmpDraw);
bitmap = null;
}
/**
* 给界面上的按钮及控件添加Listener
*/
publicvoidsetListener(){
preBundle =this.getIntent().getExtras();
subPicImgView =(ImageView)findViewById(R.id.subPicImgView);
subButton =(Button)findViewById(R.id.subButton);
returnButton =(Button)findViewById(R.id.returnMain);
//stationSpinner = (Spinner)findViewById(R.id.stationId);
subButton.setOnClickListener(subClick);
returnButton.setOnClickListener(returnClick);
helper = newDBHelper(this);
helper.open(this);
cursor =helper.loadAll();
cursor.moveToFirst();
if(!cursor.isAfterLast()){
intmodelId= cursor.getColumnIndex("ID");
intstName= cursor.getColumnIndex("STNAME");
intstid= cursor.getColumnIndex("STID");
intaddvcd= cursor.getColumnIndex("FATHER");
StationModel sm= newStationModel();
sm.setId(cursor.getInt(modelId));
sm.setStid(cursor.getInt(stid));
sm.setStname(cursor.getString(stName));
sm.setAddvcd(cursor.getString(addvcd));
list.add(sm);
cursor.moveToNext();
}
cursor.close();
helper.close();
}
/**
* 点击上传按钮触发
*/
privateOnClickListenersubClick = newOnClickListener(){
publicvoidonClick(Viewv) {
ConnectivityManagermanager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfonetworkinfo = manager.getActiveNetworkInfo();
if(networkinfo== null|| !networkinfo.isAvailable()) { // 当前网络不可用
newAlertDialog.Builder(SubmitPhoto.this)
.setMessage("检查到没有可用的网络连接,请打开网络连接")
.setPositiveButton("确定",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialoginterface, inti){
ComponentNamecn = newComponentName("com.android.settings","com.android.settings.Settings");
Intent intent =newIntent();
intent.setComponent(cn);
intent.setAction("android.intent.action.VIEW");
startActivity(intent);
// finish();
}
}
).show();
}else{
showDialog(0);
myThread= newMyThread();
myThread.start();
}
}
};
/**
* 点击返回按钮时触发的事件
*/
privateOnClickListenerreturnClick = newOnClickListener(){
publicvoidonClick(Viewv) {
newAlertDialog.Builder(SubmitPhoto.this)
.setTitle("提示").setMessage("确定放弃上传?")
.setPositiveButton("确定",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,
intwhichButton){
//if(!myThread.isInterrupted()){
//myThread.interrupt();
// }
Intent intent =newIntent();
intent.setClass(SubmitPhoto.this,MainPage.class);
finish();
startActivity(intent);
}
}).setNegativeButton("取消",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,
intwhichButton){
// 取消按钮事件
}
}
).show();
}
};
/**
* 将上个界面传过来的图片地址转换成Bitmap返回
* @return
*/
publicBitmapgetBitMap(){
String picPath =preBundle.getString("prePath");
BitmapFactory.Optionsoptions = newBitmapFactory.Options();
options.inSampleSize= 2;
Bitmapbm = BitmapFactory.decodeFile(picPath, options);
returnbm;
}
/**
* 当调用showDialog()时触发此函数
* 控制弹出的内容
*/
@Override
protectedDialogonCreateDialog(intid) {
switch(id){
case0: {
ProgressDialogdialog = newProgressDialog(SubmitPhoto.this);
dialog.setMessage("文件上传中,请稍后...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
// Log.d("dialog","<<<<<<<<<<<<<<<<-----<<<<<<<<<dialoging");
returndialog;
}
case1: {
ProgressDialogmProgressDialog = newProgressDialog(SubmitPhoto.this);
mProgressDialog.setIcon(R.drawable.ic_menu_upload_mini);
mProgressDialog.setTitle("文件上传中请稍后");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMax(100);
mProgressDialog.setButton("取消", newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog, intwhichButton) {
// removeDialog(1);
}
});
returnmProgressDialog;
}
}
returnnull;
}
/**
* 显示Dialog的method
* @param mess
*/
privatevoidshowToast(Stringmess) {
//Log.d("showToast", "======================showToast");
newAlertDialog.Builder(SubmitPhoto.this).setTitle("Message")
.setMessage(Html.fromHtml(mess)).setNegativeButton("确定",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog, intwhich) {
//if(!myThread.isInterrupted()){
//myThread.interrupt();
// }
Intent intent =newIntent();
intent.setClass(SubmitPhoto.this,MainPage.class);
finish();
startActivity(intent);
}
}).show();
}
/*
* 接收子线程传递过来的结果
* 负责给主线程发送消息
*/
HandlersubHandler = new Handler() {
publicvoid handleMessage(Message msg) {
switch(msg.what) {
case0:
showDialog(0);
break;
case1:
removeDialog(0);
Bundlebundle = msg.getData();
// Log.d("uploadresult",">>>>>>>>>>>>>>>>>>uploadresult:"+bundle.getString("uploadMsg"));
showToast(bundle.getString("uploadMsg"));
break;
case2:
removeDialog(0);
showToast("您请求的网络连接失败,请稍后重试");
break;
case3:
removeDialog(0);
showToast("<p>对不起,您的手机卡没有被许可使用本程序进行上传功能,如有问题请<ahref="mailto:qingsong.yang@bjwmt.com"mce_href="mailto:c.com">联系我们</a></p>");
break;
}
super.handleMessage(msg);
}
};
/**
* 图片上传线程
* 将上传结果通过Handler传递给主线程
* @author peter
*/
class MyThreadextends Thread implements Runnable {
private StringupMsg = "",file="",fileName="";
/**
* 判断网络是否可用
*/
public intgetCon(String url) {
int con1 = 0;
URL objURL =null;
try {
objURL = newURL(url);
con1 = 1;
} catch(MalformedURLException e2) {
con1 = 0;
}
if (objURL !=null) {
URLConnectionconn = null;
try {
conn =objURL.openConnection();
conn.setConnectTimeout(1000);
conn.setReadTimeout(1000);
con1 = 1;
} catch(IOException e) {
con1 = 0;
}
if (conn !=null) {
try {
conn.connect();
con1 = 1;
} catch(IOException e) {
con1 = 0;
}
}
}
return con1;
}
/**
* 取得请求返回的数据字符串
* @param url
* @return
*/
public StringgetText(String url){
String text ="";
try {
URL objURL = newURL(url);
URLConnectionconn = objURL.openConnection();
conn.setConnectTimeout(6* 1000);
conn.connect();
BufferedReaderbr = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringinputLine;
if (br == null){
return null;
}
while((inputLine = br.readLine()) != null) {
text +=inputLine;
}
} catch(MalformedURLException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
return text;
}
/**
* 图片上传
*/
publicvoiduploadFile(){
TelephonyManagertm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
FTPClient ftp =newFTPClient();
String server ="xx.xx.xx.xx";
String username= tm.getDeviceId();
String password= "micromulti";
try{
ftp.setDefaultTimeout(30000);
ftp.setDefaultPort(21);
ftp.connect(server);
intreply= ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
ftp.disconnect();
upMsg ="FTP 连接失败";
} else{
if(ftp.login(username,password)) {
ftp.enterLocalPassiveMode();
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setRemoteVerificationEnabled(false);
FileInputStreamfis = newFileInputStream(newFile(file));
ftp.storeFile(fileName,fis);
fis.close();
}
ftp.logout();
upMsg= "文件上传成功";
}
}catch(Exception e) {
upMsg= ""+e;
}finally{
if(ftp.isConnected()){
try{
ftp.disconnect();
}catch(Exception ioe) {
upMsg= ""+ioe;
}
}
}
}
publicvoidrun(){
Stringfile = preBundle.getString("prePath");
Stringarrs[] = file.split("/");
StringfileName = arrs[arrs.length-1];
StringfileStrArr[] = fileName.split("-");
StringphoneIMSI = fileStrArr[0];
Stringlat = fileStrArr[1];
Stringlng = fileStrArr[2];
StringshootTime = fileStrArr[3];
// Log.d("lat&lng","*******************latis:"+lat+" lng is:"+lng+" fileNameis:"+fileName);
EditTextpicInfo = (EditText)findViewById(R.id.photoInfo);
StringfreshUrl ="http://xx.xx.xx.xx:8080/DataAcquisition/photoUploadAction.do?photoWebModel.actiontype=upload";
StringpostUrl = freshUrl+"&photoWebModel.phoneIMSI="+phoneIMSI
+"&photoWebModel.lat="+lat
+"&photoWebModel.lng="+lng
+"&photoWebModel.shootTime="+shootTime
+"&photoWebModel.picInfo="+picInfo.getText()
+"&photoWebModel.filename="+fileName;
Messagemessage = newMessage();
Stringresult = "";
if(this.getCon(postUrl)==1){
result= getText(postUrl);
Log.d("uploadConfirmResult",">>>>>>>>>>>>>>>>>>"+result.trim());
}else{
message.what= 2;
}
if(result.trim().equals("true")){
StringthumbnailFilePath ="sdcard/fatalityUpload/Thumbnail_fatality/"+fileName;
uploadFile();//执行图片上传
Log.d("uploadFile",">>>>>>>>>>>>>>>>>>>>>>>>>complate!stopUpload...");
File file2 = newFile(file);
file2.delete();
file2 = null;
File file3 = newFile(thumbnailFilePath);
file3.delete();
file3 = null;
Bundlebundle = newBundle();
bundle.putString("uploadMsg",upMsg);
message.setData(bundle);
message.what= 1;
}elseif(result.trim().equals("false1")){
message.what= 3;
}else{}
Log.d("mess.what","<<<<<<<<<<<<<<<<<<message.whatis :"+message.what);
subHandler.sendMessage(message);
}
}
}
预览还没有上传的图片界面(photoview.xml):
本界面实现一个煎蛋的图像回廊,点击对应的图片后即跳转到图片编辑上传界面。
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageSwitcher
android:id="@+id/switcher"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
/>
<Gallery
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
/>
<!--
android:spacing="3dp"
-->
<Button
android:id="@+id/existUpload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_menu_upload_mini"
android:layout_marginLeft="380px"
android:layout_marginTop="50px"
android:text="上传"
/>
<Button
android:id="@+id/backMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_menu_revert_mini"
android:layout_marginLeft="380px"
android:text="返回"
/>
</RelativeLayout>
代码部分(PhotoView.java):
packagecom.bjwmt.camera;
importjava.io.File;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.content.pm.ActivityInfo;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.WindowManager;
importandroid.view.View.OnClickListener;
importandroid.view.animation.AnimationUtils;
importandroid.widget.AdapterView;
importandroid.widget.Button;
importandroid.widget.Gallery;
importandroid.widget.ImageSwitcher;
importandroid.widget.ImageView;
importandroid.widget.ViewSwitcher;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.Gallery.LayoutParams;
/**
* 图片艺廊式的选择界面 实现
* 显示照片(AdapterView)、等待听取照片单机动作(OnItemSelectedListener)、进行照片切换动作(ViewSwitcher)、负责保存照片(ViewFactory)等功能
*/
publicclassPhotoViewextendsActivity implements
AdapterView.OnItemSelectedListener,ViewSwitcher.ViewFactory {
privatestaticImageSwitchermSwitcher;
privatestaticButtonreturnButton;
privatestaticButtonsaveButton;
privateList<String>phoList;
// privateList<String> or_phoList;
privateStringnewFilePath = "";
@SuppressWarnings("unchecked")
privatestaticList<String>readFiles(String path) {
List picFiles =newArrayList();
// 构建文件对象
File dir = newFile(path);
// 得到改文件夹下所有文件
File[] files =dir.listFiles();
if(files!= null) {
for(inti =0; i < files.length; i++) {
String fileName= files[i].getName();
// 过滤所有后缀为.jpg的文件
if(fileName.lastIndexOf(".")> 0
&&fileName.substring(fileName.lastIndexOf(".") + 1,
fileName.length()).equals("jpg")||fileName.substring(fileName.lastIndexOf(".")+ 1,
fileName.length()).equals(".gif")){
picFiles.add(files[i].getPath());
}
}
}
returnpicFiles;
}
// Thread myT =new Thread(new Runnable() {
// public voidrun() {
// // TODO 让该线程实现的功能
// try {
// or_phoList =readFiles("sdcard/fatalityUpload/");
// } catch(Exception e) {
//e.printStackTrace();
// }
// }
// });
publicstaticvoidsetInSampleSize(BitmapFactory.Optionsoptions,inttargetSize) {
options.outWidth>>= 1;
options.outHeight>>= 1;
while(options.outWidth> targetSize || options.outHeight > targetSize) {
options.inSampleSize<<= 1;
options.outWidth>>= 1;
options.outHeight>>= 1;
}
}
@Override
publicvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.photoview);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
this.setListener();
mSwitcher =(ImageSwitcher) findViewById(R.id.switcher);
mSwitcher.setFactory(this);
//mSwitcher.setOnClickListener(clickImageView);
// 设置照片切换时的淡入淡出模式
mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_in));
mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_out));
Gallery g =(Gallery) findViewById(R.id.gallery);
g.setAdapter(newImageAdapter(this,phoList));
g.setOnItemSelectedListener(this);
g.setOnItemClickListener(newOnItemClickListener()
{
publicvoidonItemClick(AdapterView<?>parent,
Viewv, intposition, longid)
{
//当内容被点击的时候处理的事件
}
});
}
privatevoidsetListener(){
phoList =readFiles("sdcard/fatalityUpload/Thumbnail_fatality/");
returnButton =(Button) findViewById(R.id.backMain);
saveButton =(Button) findViewById(R.id.existUpload);
returnButton.setOnClickListener(returnClick);
saveButton.setOnClickListener(saveClick);
}
privateOnClickListenersaveClick = newOnClickListener() {
publicvoidonClick(Viewv) {
Intent intent =newIntent();
Bundle bundle =newBundle();
//bundle.putByteArray("picPre", newData);
bundle.putString("picPath",newFilePath);
//intent.putExtra("picPre", data);
intent.putExtras(bundle);
intent.setClass(PhotoView.this,SubmitPhoto.class);
finish();
startActivity(intent);
}
};
privateOnClickListenerreturnClick = newOnClickListener() {
publicvoidonClick(Viewv) {
Intent intent =newIntent();
intent.setClass(PhotoView.this,MainPage.class);
finish();
startActivity(intent);
}
};
/**
* 当用户点击照片艺廊中的照片时触发该函数
*/
@SuppressWarnings("unchecked")
publicvoidonItemSelected(AdapterViewparent, View v, intposition, longid){
String fileArr[]= phoList.get(position).toString().split("/");
newFilePath ="sdcard/fatalityUpload/fatality/"+fileArr[fileArr.length-1];
//Log.d("onItemSelectedLOG",">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+phoList.get(position).toString());
//Log.d("onItemSelectedLOG",">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+newFilePath);
Bitmap bm =BitmapFactory.decodeFile(phoList.get(position).toString());
BitmapDrawablebmpDraw=newBitmapDrawable(bm);
mSwitcher.setImageDrawable(bmpDraw);
}
publicvoidonNothingSelected(AdapterView<?>arg0) {
}
/**
* 显示照片函数
*/
publicViewmakeView(){
ImageViewimageView = newImageView(this);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
android.widget.FrameLayout.LayoutParamsimageSwitcher = newImageSwitcher.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
imageView.setLayoutParams(imageSwitcher);
returnimageView;
}
/**
* 当点击图片时切换到图片编辑上传界面
*/
// privateOnClickListener clickImageView = new OnClickListener() {
// public voidonClick(View v) {
// Intent intent= new Intent();
//intent.setClass(PhotoView.this, SubmitPhoto.class);
// finish();
//startActivity(intent);
// }
// };
}
帮助类(ImageAdapter.java):
packagecom.bjwmt.camera;
importjava.util.List;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.GridView;
importandroid.widget.ImageView;
publicclassImageAdapterextendsBaseAdapter {
intmGalleryItemBackground;
privateContextmContext;
privateList<String>lis;
publicImageAdapter(Contextc,List<String> li)
{
mContext= c;
lis=li;
TypedArraya = mContext.obtainStyledAttributes(R.styleable.Gallery);
mGalleryItemBackground= a.getResourceId(
R.styleable.Gallery_android_galleryItemBackground,0);
a.recycle();
}
publicintgetCount()
{
returnlis.size();
}
publicObjectgetItem(intposition)
{
returnposition;
}
publiclonggetItemId(intposition)
{
returnposition;
}
publicViewgetView(intposition, View convertView,
ViewGroupparent)
{
ImageViewi = newImageView(mContext);
Bitmapbm = BitmapFactory.decodeFile(lis.get(position).toString());
i.setImageBitmap(bm);
i.setScaleType(ImageView.ScaleType.CENTER_CROP);
i.setLayoutParams(newGridView.LayoutParams(88,88));
i.setBackgroundResource(mGalleryItemBackground);
i.setPadding(3,3,3,3);
returni;
}
}