精华内容
下载资源
问答
  • 压缩文件包含了android端和web端,web端使用myeclipse8.5开发的,...具体实现了手机选择相册图片或者拍照能预览图片并将图片上传到服务器。发布到手机上测试可能需要手动在手机权限管理中打开摄像头和文件读写的权限。
  • Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面。  我们要添加如下权限: <uses android:name=android.permission.WRITE_EXTERNAL_STORAGE/> <uses ...
  • android实现小视人脸识别+身份证拍照上传
  • 安卓7.0拍照权限适配解决安卓本地图片选择或者拍照更换头像上传后台,
  • 本文实例为大家分享了Android拍照及图片显示的具体代码,供大家参考,具体内容如下1、功能声明当应用需要使用相机、NFC等外设时,需要在AndroidManifest.xml中进行声明。这样,当设备缺少这些外设时,应用商店的安装...

    本文实例为大家分享了Android拍照及图片显示的具体代码,供大家参考,具体内容如下

    1、功能声明

    当应用需要使用相机、NFC等外设时,需要在AndroidManifest.xml中进行声明。

    这样,当设备缺少这些外设时,应用商店的安装程序可以拒绝安装设备。

    声明示例代码如下:

    android:required="false"/>

    2、创建指向文件的File对象

    拍摄的照片可以存放到设备的外部存储区。

    Android为不同的应用分配的独有的存储区域,同时按照存储数据的类型对存储区域做了进一步地划分。

    设置照片存储区域的代码示例如下所示:

    public File getPhotoFile(Crime crime) {

    //获取应用对应的存储照片的外部存储路径

    File externalFilesDir = mContext

    .getExternalFilesDir(Environment.DIRECTORY_PICTURES);

    if (externalFilesDir == null) {

    return null;

    }

    //创建指向文件的File对象

    return new File(externalFilesDir, crime.getPhotoFilename());

    }

    .............

    //每个crime对应的文件名

    public String getPhotoFilename() {

    return "IMG_" + getId().toString() + ".jpg";

    }

    3、触发拍照

    可以使用MediaStore.ACTION_CAPTURE_IMAGE类型的Intent触发拍照,示例代码如下:

    mPhotoButton = (ImageButton) v.findViewById(R.id.crime_camera);

    //隐式Intent触发相机拍照

    final Intent captureImageIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    //mPhotoFile保存着上文创建的指向指定地址的File

    //此处判断是否有能够处理隐式Intent的组件

    boolean canTakePhoto = mPhotoFile != null

    && captureImageIntent.resolveActivity(packageManager) != null;

    mPhotoButton.setEnabled(canTakePhoto);

    if (canTakePhoto) {

    //得到File文件对应的Uri地址

    Uri uri = Uri.fromFile(mPhotoFile);

    //将Uri地址存入到Intent中,相机拍照得到的图像将会存入到该Uri地址对应的File里

    captureImageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

    }

    mPhotoButton.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    startActivityForResult(captureImageIntent, REQUEST_PHOTO);

    }

    });

    4、处理拍照结果

    拍照完成后,将可以加载得到图片了。

    @Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

    .........

    } else if (requestCode == REQUEST_PHOTO) {

    updatePhotoView();

    }

    .........

    }

    private void updatePhotoView() {

    if (mPhotoFile == null || !mPhotoFile.exists()) {

    mPhotoView.setImageDrawable(null);

    } else {

    //加载图片对应的缩略图

    Bitmap bitmap = PictureUtils.getScaledBitmap(mPhotoFile.getPath(), getActivity());

    mPhotoView.setImageBitmap(bitmap);

    }

    }

    Bitmap只存储实际像素数据,因此即使原始照片已经压缩过,但存入Bitmap对象时,文件并不会被压缩。

    因此加载图片时,需要先按照给定区域的大小合理的缩放文件。 然后,用Bitmap加载缩放后的文件,示例代码如下:

    //在具体视图未加载前,无法得到视图的实际大小

    //因此根据屏幕尺寸,使用估算值进行缩放

    public static Bitmap getScaledBitmap(String path, Activity activity) {

    Point size = new Point();

    activity.getWindowManager().getDefaultDisplay().getSize(size);

    return getScaledBitmap(path, size.x, size.y);

    }

    public static Bitmap getScaledBitmap(String path, int destWidth, int destHeight) {

    BitmapFactory.Options options = new BitmapFactory.Options();

    options.inJustDecodeBounds = true;

    //按照正常尺寸解析文件

    BitmapFactory.decodeFile(path, options);

    //得到原始文件的宽和高

    float srcWidth = options.outWidth;

    float srcHeight = options.outHeight;

    //inSampleSize表示水平/竖直抽样比

    //例如,inSampleSize为2时,水平和数值均在原始基础上,每2个点抽取1个点

    //于是,新图的大小变为原来的1/4

    int inSampleSize = 1;

    if (srcHeight > destHeight || srcWidth > destWidth) {

    if (srcWidth > srcHeight) {

    inSampleSize = Math.round(srcHeight / destHeight);

    } else {

    inSampleSize = Math.round(srcWidth / destWidth);

    }

    }

    options = new BitmapFactory.Options();

    options.inSampleSize = inSampleSize;

    //按新的抽样比,重新解析文件

    return BitmapFactory.decodeFile(path, options);

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • android安卓app 照相+上传,录音+上传,录视频+上传(全套源代码).zip 浏览图库选择照片+上传
  • 既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传。下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案这篇文章,在...
  • 【实例简介】【实例截图】【核心代码】...import android.app.Activity;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;im...

    【实例简介】

    【实例截图】

    8c98d76c74b4efb933ddff4e6b22c15b.png

    【核心代码】

    package cn.zhaoyb.test;

    import android.app.Activity;

    import android.content.ContentValues;

    import android.content.Intent;

    import android.database.Cursor;

    import android.graphics.Bitmap;

    import android.os.Bundle;

    import android.os.Environment;

    import android.provider.MediaStore;

    import android.support.v7.app.AppCompatActivity;

    import android.text.TextUtils;

    import android.view.Gravity;

    import android.view.View;

    import android.widget.TextView;

    import android.widget.Toast;

    import java.io.BufferedOutputStream;

    import java.io.File;

    import java.io.FileOutputStream;

    import java.text.SimpleDateFormat;

    import java.util.Date;

    import cn.zhaoyb.zcore.uploadimage.UploadManager;

    import cn.zhaoyb.zcore.uploadimage.entity.SimpleUploadView;

    public class MainActivity extends AppCompatActivity {

    private MyUploadModel mUploadModel;

    private SimpleUploadView mUploadView;

    private TextView mUploadFileTip;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mUploadView = (SimpleUploadView) findViewById(R.id.upload_view_simple1);

    mUploadFileTip = (TextView) findViewById(R.id.edit_text_simple1);

    }

    // 拍照得到照片路径

    public void doCamera(View v) {

    Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    startActivityForResult(it, 1);

    }

    // 本地选择图片

    public void doFile(View v) {

    Intent local = new Intent();

    local.setType("image/*");

    local.setAction(Intent.ACTION_PICK);

    startActivityForResult(local, 2);

    }

    // 回传图片或图片路径

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode != Activity.RESULT_OK) return;

    if (requestCode == 1) {

    Bundle extras = data.getExtras();

    Bitmap b = (Bitmap) extras.get("data");

    // 设置显示的图片

    mUploadView.getProgressImage().setImageBitmap(b);

    String name = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());

    String filePath = Environment.getExternalStorageDirectory().toString() File.separator "temp/image/" name ".jpg";

    File myCaptureFile = new File(filePath);

    try {

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

    if (!myCaptureFile.getParentFile().exists()) {

    myCaptureFile.getParentFile().mkdirs();

    }

    BufferedOutputStream bos;

    bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));

    b.compress(Bitmap.CompressFormat.JPEG, 80, bos);

    bos.flush();

    bos.close();

    updatePic(filePath);

    } else {

    Toast toast = Toast.makeText(MainActivity.this, "保存失败,SD卡无效", Toast.LENGTH_SHORT);

    toast.setGravity(Gravity.CENTER, 0, 0);

    toast.show();

    }

    } catch (Exception e) {

    }

    } else {

    try {

    Cursor cursor = managedQuery(data.getData(), new String[]{MediaStore.Images.Media.DATA},

    null, null, null);

    int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

    cursor.moveToFirst();

    //最后根据索引值获取图片路径

    String filePath = cursor.getString(index);

    if (TextUtils.isEmpty(filePath)) return;

    updatePic(filePath);

    } catch (Exception e) {

    }

    }

    }

    /**

    * 生成上传实体类并且绑定视图

    * @param picPath

    */

    private void updatePic(String picPath) {

    if (mUploadModel == null) {

    mUploadModel = new MyUploadModel();

    }

    // 添加额外的上传参数

    mUploadModel.setUploadParams(getUploadParams());

    // 显示选择的图片

    mUploadFileTip.setText(picPath);

    // 重新绑定新图片路径

    mUploadModel.setLocalPath(picPath);

    // 上传前会绑定显示视图

    mUploadModel.bindUploadProgress(mUploadView);

    }

    public void doUpload(View v) {

    UploadManager.getInstance().execute("http://up-z1.qiniu.com", mUploadModel);

    }

    /**

    *

    * 因为此处我使用了七牛云存储接收图片,因为需要拼装相应的请求参数

    * 此处只是做了个模拟,随便输入一个token所以上传后,返回的数据是...Bad token

    * @return

    */

    private ContentValues getUploadParams() {

    ContentValues uploadParams = new ContentValues();

    uploadParams.put("token", "asdflkasjdlkfjalksdjflkajsdlkfjalksjdflkajsdljlasjefljlasdf");

    return uploadParams;

    }

    @Override

    protected void onDestroy() {

    super.onDestroy();

    if (mUploadModel != null) {

    mUploadModel.destory();

    }

    ((App)getApplication()).exit();

    }

    }

    展开全文
  • android程序开发中我们经常见到需要上传图片的场景,在这里有个技术点,需要把图片压缩处理,然后再进行上传。这样可以减少流量的消耗,提高图片的上传速度等问题。 关于android如何压缩,网上的资料也是很多,但...
  • 安卓开发 手机相机程序,照片旋转处理.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Android开发——通过HTTP协议,客户端发送图片到服务器,服务器接收图片,仅供参考。
  • 脸萌的Android开发.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 前几天,我们客户端这边收到了市场部的一个需求,需要在我们订单成交后,我们的客户端有一个上传交易凭证的功能,那么如何在Android实现上传图片的这个功能呢?在我进行编码之前,我先问自己几个问题。 第一, 图片...
  • 本文实例讲述了Android实现拍照上传功能的方法。分享给大家供大家参考,具体如下: 1、LoginWindow.java --登录窗口 package com.hemi.rhet; import com.hemi.rhet.R; import android.app.Activity; import ...
  • 基于Android拍照上传程序开发

    千次阅读 2015-06-23 09:16:02
    基于Android拍照上传程序开发 基于Android拍照上传程序开发 大家好,我是PETER(cfwdl)。写这篇文章是为了帮助以前没有没有接触过anroid或是刚刚入门并没有摸过手机的硬件设备监测、使用等功能的朋友,...

    基于Android拍照上传程序开发

    基于Android拍照上传程序开发


    大家好,我是PETER(cfwdl)。写这篇文章是为了帮助以前没有没有接触过anroid或是刚刚入门并没有摸过手机的硬件设备监测、使用等功能的朋友,给大家一个我自己的写的心得和经验,我也是新手,所以大家互相交换一下经验吧。当然每个程序都会有问题,因为我不是最终用户,软件的测试工作没有好好测试过,大家凑合看看吧~!


    程序介绍:
    本程序主要完成一个煎蛋的android手机拍照程序(本程序的拍照功能比较简单,没有添加处理图像、手机自动对焦等功能,如果有需要的朋友可以自行参考一下相关linsteneraction的资料)
    主功能:手机拍照、拍照预览、图片的存储、图片资料编辑、图像上传等功能
    其他相关需求:监测手机网络状态、监测手机GPS状态、获取GPS位置、获取基站位置等。


     

    需求分析:

    (
    程序流程)
    正如上图所示,我大致的画了一下这个程序的简单的工作流程。
    那么,各位看官们,现在开始我们的程序开发之旅吧。


    程序设计:

    PS:
    本人不是美工,所以界面肯定灰常粗糙,不过不影响我们展示功能~!大家权且凑合继续看


    主界面(camera_surface.xml)

    本界面使用AbsoluteLayout布局来设计该界面,
    下面的代码中我定义了一个全屏的SurfaceView用来在我们进入程序的第一个界面(就是拍照界面),
    一个IDnowLocalityTextView,来动态的刷新用户手机当前获取到的位置信息。
    三个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;

        } 

    }

     

    展开全文
  • WebView在android端File标签的拍照跟图片上传 WebView在android端File标签的拍照跟图片上传
  • 这个程序是用来拍照上传并且保存到本地的例子,已经根据我的需求完善了,图片也有压缩和未压缩两种保存方式,如果做的过程有什么不明白的请联系我,内有联系方式!
  • 在日常开发过程中,这三种功能是再常见不过了,网上相关的文档也一大堆,不过未免让人眼花撩乱,因此记录做下整理! (PS:目前相册选择照片和调用摄像头拍照已经实现了压缩,录制小视频暂未实现,哪位大佬有好的...
  • android仿微信发朋友圈,调用系统拍照和选择照片activity.
  • 现在Android智能手机的像素都会提供照相的功能,大部分的手机的摄像头的像素都在1000万以上的像素,有的甚至会更高。它们大多都会支持光学变焦、曝光以及快门等等。 下面的程序Demo实例示范了使用Camera v2来进行...
  • 网上有很多关于拍照上传的实现方法,如果用新版本android去运行有可能会发现根本实现不了。主要原因是android从4.4版本开始通过intent.ACTION_GET_CONTENT打开选择器后,getData()返回的URI没有包含真实的文件路径,...
  • 可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 。很不错的源码,大家有需要可以下载看看 。 如果不知道如何上传文件,参考: http://blog.c

    摘自:http://blog.csdn.net/jdsjlzx/article/details/44160603/



    仿照微信,朋友圈分享图片功能 。可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 。很不错的源码,大家有需要可以下载看看 。

    如果不知道如何上传文件,参考: http://blog.csdn.net/jdsjlzx/article/details/41694323

    多文件上传,参考:http://www.open-open.com/code/view/1433146762900

    android-multiple-images-selector

    简介:一个选择图片的库,支持设置选择图片的张数,支持过滤小图片。

    有兴趣的可以看看上面的开源项目,下面正文开始。


    Retrofit技术已经到了,赶快体验吧

    Android使用Retrofit技术仿微信图片上传,可以选择多张图片拍照上传   http://blog.csdn.net/jdsjlzx/article/details/51511474


    正文开始。


    微信

    微信

    微信

    微信

    下载地址 : 微信上传图片源码

    很多网友不知道怎么获取图片路径,这里贴出来:

    String path = Bimp.tempSelectBitmap.get(position).getImagePath();

    //部分代码如下

    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. package com.king.photo.activity;  
    2.    
    3. import android.annotation.SuppressLint;  
    4. import android.app.Activity;  
    5. import android.content.Context;  
    6. import android.content.Intent;  
    7. import android.graphics.Bitmap;  
    8. import android.graphics.BitmapFactory;  
    9. import android.graphics.Color;  
    10. import android.graphics.drawable.BitmapDrawable;  
    11. import android.graphics.drawable.ColorDrawable;  
    12. import android.os.Bundle;  
    13. import android.os.Handler;  
    14. import android.os.Message;  
    15. import android.provider.MediaStore;  
    16. import android.util.Log;  
    17. import android.view.Gravity;  
    18. import android.view.KeyEvent;  
    19. import android.view.LayoutInflater;  
    20. import android.view.View;  
    21. import android.view.View.OnClickListener;  
    22. import android.view.ViewGroup;  
    23. import android.view.ViewGroup.LayoutParams;  
    24. import android.view.animation.AnimationUtils;  
    25. import android.widget.AdapterView;  
    26. import android.widget.AdapterView.OnItemClickListener;  
    27. import android.widget.BaseAdapter;  
    28. import android.widget.Button;  
    29. import android.widget.GridView;  
    30. import android.widget.ImageView;  
    31. import android.widget.LinearLayout;  
    32. import android.widget.PopupWindow;  
    33. import android.widget.RelativeLayout;  
    34.    
    35. import com.king.photo.R;  
    36. import com.king.photo.util.Bimp;  
    37. import com.king.photo.util.FileUtils;  
    38. import com.king.photo.util.ImageItem;  
    39. import com.king.photo.util.PublicWay;  
    40. import com.king.photo.util.Res;  
    41.    
    42.    
    43.    
    44.  //首页面activity  
    45.    
    46. public class MainActivity extends Activity {  
    47.    
    48.     private GridView noScrollgridview;  
    49.     private GridAdapter adapter;  
    50.     private View parentView;  
    51.     private PopupWindow pop = null;  
    52.     private LinearLayout ll_popup;  
    53.     public static Bitmap bimap ;  
    54.       
    55.     protected void onCreate(Bundle savedInstanceState) {  
    56.         super.onCreate(savedInstanceState);  
    57.         Res.init(this);  
    58.         bimap = BitmapFactory.decodeResource(  
    59.                 getResources(),  
    60.                 R.drawable.icon_addpic_unfocused);  
    61.         PublicWay.activityList.add(this);  
    62.         parentView = getLayoutInflater().inflate(R.layout.activity_selectimg, null);  
    63.         setContentView(parentView);  
    64.         Init();  
    65.     }  
    66.    
    67.     public void Init() {  
    68.           
    69.         pop = new PopupWindow(MainActivity.this);  
    70.           
    71.         View view = getLayoutInflater().inflate(R.layout.item_popupwindows, null);  
    72.    
    73.         ll_popup = (LinearLayout) view.findViewById(R.id.ll_popup);  
    74.           
    75.         pop.setWidth(LayoutParams.MATCH_PARENT);  
    76.         pop.setHeight(LayoutParams.WRAP_CONTENT);  
    77.         pop.setBackgroundDrawable(new BitmapDrawable());  
    78.         pop.setFocusable(true);  
    79.         pop.setOutsideTouchable(true);  
    80.         pop.setContentView(view);  
    81.           
    82.         RelativeLayout parent = (RelativeLayout) view.findViewById(R.id.parent);  
    83.         Button bt1 = (Button) view  
    84.                 .findViewById(R.id.item_popupwindows_camera);  
    85.         Button bt2 = (Button) view  
    86.                 .findViewById(R.id.item_popupwindows_Photo);  
    87.         Button bt3 = (Button) view  
    88.                 .findViewById(R.id.item_popupwindows_cancel);  
    89.         parent.setOnClickListener(new OnClickListener() {  
    90.               
    91.             @Override  
    92.             public void onClick(View v) {  
    93.                 // TODO Auto-generated method stub  
    94.                 pop.dismiss();  
    95.                 ll_popup.clearAnimation();  
    96.             }  
    97.         });  
    98.         bt1.setOnClickListener(new OnClickListener() {  
    99.             public void onClick(View v) {  
    100.                 photo();  
    101.                 pop.dismiss();  
    102.                 ll_popup.clearAnimation();  
    103.             }  
    104.         });  
    105.         bt2.setOnClickListener(new OnClickListener() {  
    106.             public void onClick(View v) {  
    107.                 Intent intent = new Intent(MainActivity.this,  
    108.                         AlbumActivity.class);  
    109.                 startActivity(intent);  
    110.                 overridePendingTransition(R.anim.activity_translate_in, R.anim.activity_translate_out);  
    111.                 pop.dismiss();  
    112.                 ll_popup.clearAnimation();  
    113.             }  
    114.         });  
    115.         bt3.setOnClickListener(new OnClickListener() {  
    116.             public void onClick(View v) {  
    117.                 pop.dismiss();  
    118.                 ll_popup.clearAnimation();  
    119.             }  
    120.         });  
    121.           
    122.         noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);    
    123.         noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));  
    124.         adapter = new GridAdapter(this);  
    125.         adapter.update();  
    126.         noScrollgridview.setAdapter(adapter);  
    127.         noScrollgridview.setOnItemClickListener(new OnItemClickListener() {  
    128.    
    129.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
    130.                     long arg3) {  
    131.                 if (arg2 == Bimp.tempSelectBitmap.size()) {  
    132.                     Log.i("ddddddd""----------");  
    133.                     ll_popup.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.activity_translate_in));  
    134.                     pop.showAtLocation(parentView, Gravity.BOTTOM, 00);  
    135.                 } else {  
    136.                     Intent intent = new Intent(MainActivity.this,  
    137.                             GalleryActivity.class);  
    138.                     intent.putExtra("position""1");  
    139.                     intent.putExtra("ID", arg2);  
    140.                     startActivity(intent);  
    141.                 }  
    142.             }  
    143.         });  
    144.    
    145.     }  
    146.    
    147.     @SuppressLint("HandlerLeak")  
    148.     public class GridAdapter extends BaseAdapter {  
    149.         private LayoutInflater inflater;  
    150.         private int selectedPosition = -1;  
    151.         private boolean shape;  
    152.    
    153.         public boolean isShape() {  
    154.             return shape;  
    155.         }  
    156.    
    157.         public void setShape(boolean shape) {  
    158.             this.shape = shape;  
    159.         }  
    160.    
    161.         public GridAdapter(Context context) {  
    162.             inflater = LayoutInflater.from(context);  
    163.         }  
    164.    
    165.         public void update() {  
    166.             loading();  
    167.         }  
    168.    
    169.         public int getCount() {  
    170.             if(Bimp.tempSelectBitmap.size() == 9){  
    171.                 return 9;  
    172.             }  
    173.             return (Bimp.tempSelectBitmap.size() + 1);  
    174.         }  
    175.    
    176.         public Object getItem(int arg0) {  
    177.             return null;  
    178.         }  
    179.    
    180.         public long getItemId(int arg0) {  
    181.             return 0;  
    182.         }  
    183.    
    184.         public void setSelectedPosition(int position) {  
    185.             selectedPosition = position;  
    186.         }  
    187.    
    188.         public int getSelectedPosition() {  
    189.             return selectedPosition;  
    190.         }  
    191.    
    192.         public View getView(int position, View convertView, ViewGroup parent) {  
    193.             ViewHolder holder = null;  
    194.             if (convertView == null) {  
    195.                 convertView = inflater.inflate(R.layout.item_published_grida,  
    196.                         parent, false);  
    197.                 holder = new ViewHolder();  
    198.                 holder.image = (ImageView) convertView  
    199.                         .findViewById(R.id.item_grida_image);  
    200.                 convertView.setTag(holder);  
    201.             } else {  
    202.                 holder = (ViewHolder) convertView.getTag();  
    203.             }  
    204.    
    205.             if (position ==Bimp.tempSelectBitmap.size()) {  
    206.                 holder.image.setImageBitmap(BitmapFactory.decodeResource(  
    207.                         getResources(), R.drawable.icon_addpic_unfocused));  
    208.                 if (position == 9) {  
    209.                     holder.image.setVisibility(View.GONE);  
    210.                 }  
    211.             } else {  
    212.                 holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());  
    213.             }  
    214.    
    215.             return convertView;  
    216.         }  
    217.    
    218.         public class ViewHolder {  
    219.             public ImageView image;  
    220.         }  
    221.    
    222.         Handler handler = new Handler() {  
    223.             public void handleMessage(Message msg) {  
    224.                 switch (msg.what) {  
    225.                 case 1:  
    226.                     adapter.notifyDataSetChanged();  
    227.                     break;  
    228.                 }  
    229.                 super.handleMessage(msg);  
    230.             }  
    231.         };  
    232.    
    233.         public void loading() {  
    234.             new Thread(new Runnable() {  
    235.                 public void run() {  
    236.                     while (true) {  
    237.                         if (Bimp.max == Bimp.tempSelectBitmap.size()) {  
    238.                             Message message = new Message();  
    239.                             message.what = 1;  
    240.                             handler.sendMessage(message);  
    241.                             break;  
    242.                         } else {  
    243.                             Bimp.max += 1;  
    244.                             Message message = new Message();  
    245.                             message.what = 1;  
    246.                             handler.sendMessage(message);  
    247.                         }  
    248.                     }  
    249.                 }  
    250.             }).start();  
    251.         }  
    252.     }  
    253.    
    254.     public String getString(String s) {  
    255.         String path = null;  
    256.         if (s == null)  
    257.             return "";  
    258.         for (int i = s.length() - 1; i > 0; i++) {  
    259.             s.charAt(i);  
    260.         }  
    261.         return path;  
    262.     }  
    263.    
    264.     protected void onRestart() {  
    265.         adapter.update();  
    266.         super.onRestart();  
    267.     }  
    268.    
    269.     private static final int TAKE_PICTURE = 0x000001;  
    270.    
    271.     public void photo() {  
    272.         Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
    273.         startActivityForResult(openCameraIntent, TAKE_PICTURE);  
    274.     }  
    275.    
    276.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    277.         switch (requestCode) {  
    278.         case TAKE_PICTURE:  
    279.             if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) {  
    280.                   
    281.                 String fileName = String.valueOf(System.currentTimeMillis());  
    282.                 Bitmap bm = (Bitmap) data.getExtras().get("data");  
    283.                 FileUtils.saveBitmap(bm, fileName);  
    284.                   
    285.                 ImageItem takePhoto = new ImageItem();  
    286.                 takePhoto.setBitmap(bm);  
    287.                 Bimp.tempSelectBitmap.add(takePhoto);  
    288.             }  
    289.             break;  
    290.         }  
    291.     }  
    292.       
    293.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
    294.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
    295.             for(int i=0;i<PublicWay.activityList.size();i++){  
    296.                 if (null != PublicWay.activityList.get(i)) {  
    297.                     PublicWay.activityList.get(i).finish();  
    298.                 }  
    299.             }  
    300.             System.exit(0);  
    301.         }  
    302.         return true;  
    303.     }  
    304.    
    305. }  
    306.    
    307.    

    下载地址 : 微信上传图片源码

    备份下载地址:http://download.csdn.net/detail/jdsjlzx/8486449


    补充:

    通过GridView仿微信动态添加本地图片

    此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲!

    一. 实现效果

        主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看,不足之处在于+好没有移动至最后,但原理相同.
          

    二. 项目工程结构




    三. 界面布局详细代码

        1.主界面activity_main.xml
        主要通过相对布局实现,第一部分是底部的TextView,中间是EditView和GridView相对布局,下面是两个按钮.同时EditView调用res/drawable-hdpi中的editview_shape.xml,GridView显示的每张图片通过griditem_addpic.xml实现.

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     xmlns:tools="http://schemas.android.com/tools"  
    3.     android:id="@+id/container"  
    4.     android:layout_width="match_parent"  
    5.     android:layout_height="match_parent"  
    6.     tools:context="com.example.suishoupaipublish.MainActivity"  
    7.     tools:ignore="MergeRootFrame" >  
    8.       
    9.     <!-- 顶部添加文字 -->   
    10.     <RelativeLayout    
    11.         android:id="@+id/Layout_top"    
    12.         android:orientation="horizontal"     
    13.         android:layout_width="fill_parent"    
    14.         android:layout_height="40dp"    
    15.         android:layout_marginTop="5dp"  
    16.         android:layout_alignParentTop="true"    
    17.         android:gravity="center">    
    18.         <TextView    
    19.             android:layout_width="fill_parent"     
    20.             android:layout_height="wrap_content"      
    21.             android:textSize="25sp"  
    22.             android:gravity="center"  
    23.             android:text="发布信息" />   
    24.     </RelativeLayout>    
    25.     <!-- 底部按钮 -->    
    26.     <RelativeLayout    
    27.         android:id="@+id/Layout_bottom"     
    28.         android:layout_alignParentBottom="true"  
    29.         android:layout_width="fill_parent"     
    30.         android:layout_height="50dp"  
    31.         android:gravity="center" >    
    32.         <Button    
    33.             android:id="@+id/button1"    
    34.             android:layout_width="wrap_content"    
    35.             android:layout_height="fill_parent"  
    36.             android:textSize="20sp"  
    37.             android:text="发布拍拍" />    
    38.         <Button    
    39.             android:id="@+id/button2"    
    40.             android:layout_width="wrap_content"    
    41.             android:layout_height="fill_parent"  
    42.             android:layout_toRightOf="@+id/button1"  
    43.             android:textSize="20sp"  
    44.             android:text="取消发布" />  
    45.     </RelativeLayout>    
    46.     <!-- 显示图片 -->    
    47.     <RelativeLayout    
    48.         android:id="@+id/Content_Layout"       
    49.         android:layout_width="fill_parent"     
    50.         android:layout_height="fill_parent"    
    51.         android:layout_above="@id/Layout_bottom"     
    52.         android:layout_below="@id/Layout_top"      
    53.         android:gravity="center">       
    54.         <LinearLayout     
    55.             android:layout_width="match_parent"    
    56.             android:layout_height="match_parent"    
    57.             android:orientation="vertical"  
    58.             android:layout_alignParentBottom="true" >   
    59.             <!-- 设置运行多行 设置圆角图形 黑色字体-->  
    60.             <EditText   
    61.                 android:id="@+id/editText1"  
    62.                 android:layout_height="120dp"  
    63.                 android:layout_width="fill_parent"  
    64.                 android:textColor="#000000"  
    65.                 android:layout_margin="12dp"  
    66.                 android:textSize="20sp"  
    67.                 android:hint="随手说出你此刻的心声..."  
    68.                 android:maxLength="500"  
    69.                 android:singleLine="false"  
    70.                 android:background="@drawable/editview_shape" />  
    71.             <!-- 网格显示图片 行列间距5dp 每列宽度90dp -->  
    72.             <GridView  
    73.                 android:id="@+id/gridView1"  
    74.                 android:layout_width="fill_parent"  
    75.                 android:layout_height="200dp"  
    76.                 android:layout_margin="10dp"  
    77.                 android:background="#EFDFDF"  
    78.                 android:horizontalSpacing="5dp"  
    79.                 android:verticalSpacing="5dp"  
    80.                 android:numColumns="4"  
    81.                 android:columnWidth="90dp"  
    82.                 android:stretchMode="columnWidth"  
    83.                 android:gravity="center" >  
    84.             </GridView>  
    85.             <TextView   
    86.                 android:layout_width="fill_parent"  
    87.                 android:layout_height="wrap_content"  
    88.                 android:text="(友情提示:只能添加9张图片,长按图片可以删除已添加图片)"  
    89.                 android:gravity="center" />  
    90.         </LinearLayout>  
    91.     </RelativeLayout>  
    92.       
    93. </RelativeLayout>  
        2.显示ImageView图片布局griditem_addpic.xml
    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"  
    5.     android:gravity="center"  
    6.     android:descendantFocusability="blocksDescendants"  
    7.     android:orientation="vertical" >  
    8.     <RelativeLayout  
    9.         android:layout_gravity="center"  
    10.         android:layout_width="80dp"  
    11.         android:layout_height="80dp"  
    12.         android:orientation="vertical" >  
    13.         <ImageView  
    14.             android:layout_marginTop="10dp"  
    15.             android:layout_marginRight="10dp"  
    16.             android:id="@+id/imageView1"  
    17.             android:layout_width="fill_parent"  
    18.             android:layout_height="fill_parent"  
    19.             android:scaleType="fitXY"  
    20.             android:src="@drawable/gridview_addpic" />  
    21.     </RelativeLayout>  
    22. </LinearLayout>  
        3.设置EditView控件圆角和颜色 editview_shape.xml
    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <shape xmlns:android="http://schemas.android.com/apk/res/android"   
    3.     android:shape="rectangle"   
    4.     android:padding="10dp">  
    5.     <!-- 填充editView的颜色 -->  
    6.     <soild android:color="#ffffff"/>  
    7.     <!-- 设置圆角的弧度,radius半径越大,editView的边角越圆 -->  
    8.     <corners   
    9.         android:radius="15dp"  
    10.         android:bottomRightRadius="15dp"  
    11.         android:bottomLeftRadius="15dp"  
    12.         android:topLeftRadius="15dp"    
    13.         android:topRightRadius="15dp"/>  
    14.     <stroke  
    15.         android:color="#32CD32"    
    16.         android:width="4px" />   
    17. </shape>  

    四. 代码详解


        它主要是思想如下:
        1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setOnItemClickListener()点击函数中响应不同操作.
        2.当点击加号图片(+)时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage.
        3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片.
        4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除.

        具体代码如下所示:
    [java]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. public class MainActivity extends Activity {  
    2.   
    3.     private GridView gridView1;              //网格显示缩略图  
    4.     private Button buttonPublish;            //发布按钮  
    5.     private final int IMAGE_OPEN = 1;        //打开图片标记  
    6.     private String pathImage;                //选择图片路径  
    7.     private Bitmap bmp;                      //导入临时图片  
    8.     private ArrayList<HashMap<String, Object>> imageItem;  
    9.     private SimpleAdapter simpleAdapter;     //适配器  
    10.       
    11.     @Override  
    12.     protected void onCreate(Bundle savedInstanceState) {  
    13.         super.onCreate(savedInstanceState);  
    14.         setContentView(R.layout.activity_main);  
    15.         /* 
    16.          * 防止键盘挡住输入框 
    17.          * 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan" 
    18.          * 希望动态调整高度 android:windowSoftInputMode="adjustResize" 
    19.          */  
    20.         getWindow().setSoftInputMode(WindowManager.LayoutParams.  
    21.                 SOFT_INPUT_ADJUST_PAN);  
    22.         //锁定屏幕  
    23.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
    24.         setContentView(R.layout.activity_main);  
    25.         //获取控件对象  
    26.         gridView1 = (GridView) findViewById(R.id.gridView1);  
    27.   
    28.         /* 
    29.          * 载入默认图片添加图片加号 
    30.          * 通过适配器实现 
    31.          * SimpleAdapter参数imageItem为数据源 R.layout.griditem_addpic为布局 
    32.          */  
    33.         //获取资源图片加号  
    34.         bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gridview_addpic);  
    35.         imageItem = new ArrayList<HashMap<String, Object>>();  
    36.         HashMap<String, Object> map = new HashMap<String, Object>();  
    37.         map.put("itemImage", bmp);  
    38.         imageItem.add(map);  
    39.         simpleAdapter = new SimpleAdapter(this,   
    40.                 imageItem, R.layout.griditem_addpic,   
    41.                 new String[] { "itemImage"}, new int[] { R.id.imageView1});   
    42.         /* 
    43.          * HashMap载入bmp图片在GridView中不显示,但是如果载入资源ID能显示 如 
    44.          * map.put("itemImage", R.drawable.img); 
    45.          * 解决方法: 
    46.          *              1.自定义继承BaseAdapter实现 
    47.          *              2.ViewBinder()接口实现 
    48.          *  参考 http://blog.csdn.net/admin_/article/details/7257901 
    49.          */  
    50.         simpleAdapter.setViewBinder(new ViewBinder() {    
    51.             @Override    
    52.             public boolean setViewValue(View view, Object data,    
    53.                     String textRepresentation) {    
    54.                 // TODO Auto-generated method stub    
    55.                 if(view instanceof ImageView && data instanceof Bitmap){    
    56.                     ImageView i = (ImageView)view;    
    57.                     i.setImageBitmap((Bitmap) data);    
    58.                     return true;    
    59.                 }    
    60.                 return false;    
    61.             }  
    62.         });    
    63.         gridView1.setAdapter(simpleAdapter);  
    64.           
    65.         /* 
    66.          * 监听GridView点击事件 
    67.          * 报错:该函数必须抽象方法 故需要手动导入import android.view.View; 
    68.          */  
    69.         gridView1.setOnItemClickListener(new OnItemClickListener() {  
    70.             @Override  
    71.             public void onItemClick(AdapterView<?> parent, View v, int position, long id)  
    72.             {  
    73.                 if( imageItem.size() == 10) { //第一张为默认图片  
    74.                     Toast.makeText(MainActivity.this"图片数9张已满", Toast.LENGTH_SHORT).show();  
    75.                 }  
    76.                 else if(position == 0) { //点击图片位置为+ 0对应0张图片  
    77.                     Toast.makeText(MainActivity.this"添加图片", Toast.LENGTH_SHORT).show();  
    78.                     //选择图片  
    79.                     Intent intent = new Intent(Intent.ACTION_PICK,         
    80.                             android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);    
    81.                     startActivityForResult(intent, IMAGE_OPEN);    
    82.                     //通过onResume()刷新数据  
    83.                 }  
    84.                 else {  
    85.                     dialog(position);  
    86.                     //Toast.makeText(MainActivity.this, "点击第"+(position + 1)+" 号图片",   
    87.                     //      Toast.LENGTH_SHORT).show();  
    88.                 }  
    89.             }  
    90.         });    
    91.     }  
    92.       
    93.     //获取图片路径 响应startActivityForResult    
    94.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
    95.         super.onActivityResult(requestCode, resultCode, data);          
    96.         //打开图片    
    97.         if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) {          
    98.             Uri uri = data.getData();    
    99.             if (!TextUtils.isEmpty(uri.getAuthority())) {    
    100.                 //查询选择图片    
    101.                 Cursor cursor = getContentResolver().query(    
    102.                         uri,    
    103.                         new String[] { MediaStore.Images.Media.DATA },    
    104.                         null,     
    105.                         null,     
    106.                         null);    
    107.                 //返回 没找到选择图片    
    108.                 if (null == cursor) {    
    109.                     return;    
    110.                 }    
    111.                 //光标移动至开头 获取图片路径    
    112.                 cursor.moveToFirst();    
    113.                 pathImage = cursor.getString(cursor    
    114.                         .getColumnIndex(MediaStore.Images.Media.DATA));    
    115.             }  
    116.         }  //end if 打开图片  
    117.     }  
    118.       
    119.     //刷新图片  
    120.     @Override  
    121.     protected void onResume() {  
    122.         super.onResume();  
    123.         if(!TextUtils.isEmpty(pathImage)){  
    124.             Bitmap addbmp=BitmapFactory.decodeFile(pathImage);  
    125.             HashMap<String, Object> map = new HashMap<String, Object>();  
    126.             map.put("itemImage", addbmp);  
    127.             imageItem.add(map);  
    128.             simpleAdapter = new SimpleAdapter(this,   
    129.                     imageItem, R.layout.griditem_addpic,   
    130.                     new String[] { "itemImage"}, new int[] { R.id.imageView1});   
    131.             simpleAdapter.setViewBinder(new ViewBinder() {    
    132.                 @Override    
    133.                 public boolean setViewValue(View view, Object data,    
    134.                         String textRepresentation) {    
    135.                     // TODO Auto-generated method stub    
    136.                     if(view instanceof ImageView && data instanceof Bitmap){    
    137.                         ImageView i = (ImageView)view;    
    138.                         i.setImageBitmap((Bitmap) data);    
    139.                         return true;    
    140.                     }    
    141.                     return false;    
    142.                 }  
    143.             });   
    144.             gridView1.setAdapter(simpleAdapter);  
    145.             simpleAdapter.notifyDataSetChanged();  
    146.             //刷新后释放防止手机休眠后自动添加  
    147.             pathImage = null;  
    148.         }  
    149.     }  
    150.       
    151.     /* 
    152.      * Dialog对话框提示用户删除操作 
    153.      * position为删除图片位置 
    154.      */  
    155.     protected void dialog(final int position) {  
    156.         AlertDialog.Builder builder = new Builder(MainActivity.this);  
    157.         builder.setMessage("确认移除已添加图片吗?");  
    158.         builder.setTitle("提示");  
    159.         builder.setPositiveButton("确认"new DialogInterface.OnClickListener() {  
    160.             @Override  
    161.             public void onClick(DialogInterface dialog, int which) {  
    162.                 dialog.dismiss();  
    163.                 imageItem.remove(position);  
    164.                 simpleAdapter.notifyDataSetChanged();  
    165.             }  
    166.         });  
    167.         builder.setNegativeButton("取消"new DialogInterface.OnClickListener() {  
    168.             @Override  
    169.             public void onClick(DialogInterface dialog, int which) {  
    170.                 dialog.dismiss();  
    171.                 }  
    172.             });  
    173.         builder.create().show();  
    174.     }  
    175.   
    176. }  
        同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.
    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <!-- 申明网络权限  -->  
    2. <uses-permission android:name="android.permission.INTERNET" />  
    3. <!-- 申明权限 操作SD卡 -->    
    4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

    五. 总结

        
        该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示.
        这时有两种解决方法,一种是自定义继承BaseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法.
        下载地址:http://download.csdn.net/detail/eastmount/8237429


    下面再分享个图片处理的博客。

     demo下载地址: 
            http://download.csdn.net/detail/eastmount/8432127
            http://pan.baidu.com/s/1c0kz3by

    一. 项目结构及界面

            项目工程结构如下图所示:

      
           个人还是比较欣赏这个布局的,其中MainActivity.java是主界面,ProcessActivity.java是图像处理界面,而剩余五个java对应五个不同的图像处理算法:EffectProcessImage(图像特效)、FrameProcessImage(添加相框)、IncreaseProcessImage(图像增强)、PersonProcessImage(图像交互)和WatchProcessImage(查看图片).
            同时Layout中有五个xml子布局,采用PopupWindow形式显示五个不同的处理,同时该demo比较好移植,将文件依次复制过去并且MainActivity改成子活动,即可调用.
            其中部分界面如下:
         
                         MainActivity主界面                              添加图片选项                          图像处理子界面(底部五个) 

    二. 图像查看功能

            点击主界面GridView中"+"添加图片后,可以选择从相册添加或照相,加载图片进行到处理界面后,点击底部"查看"按钮它会有选中的效果(图标颜色变蓝&背景颜色加深).同时PopupWindow弹出如下界面:


            其中点击"旋转"后提交的动态图如下所示:
        
            参考以前我的博客:
                [Android] 拍照、截图、保存并显示在ImageView控件中        
                [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理
                [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印
            其他效果如下,同时存在几个问题:
                1.图像绘图保存我没有做
                2.移动和缩放图像,上传的都是原图大小
                3.添加水印功能感觉简单就没实现
       

    三. 图像增强功能

            图像增强主要是通过3个进度条SeekBar实现,可以调节图像的饱和度、亮度和色相.当饱和度等于0时就是黑白二值图像,三个滑动条可以相互调节.如下图所示:



            参考我的以前博客:
                [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理
                [Android] 图像处理整合之处理ColorMatrix和Intend传递路径显示图像
                [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)
            同时需要注意一个问题: 设置滑动条时需要设置其区间,同时在弹出PopupWindow注意其宽度和不同手机的适屏处理.
            该部分算法处理代码如下,每部分算法调用后返回值都是bitmap,然后调用imageShow.setImageBitmap(mbmp);直接显示.


    四. 图像特效功能

            PopupWindow弹出如下界面,主要包括:怀旧、浮雕、光照、素描和锐化处理.


            其中特效效果和EffectProcessImage.java如下所示:
        
            参考我的博客:
                [Android] 通过Menu实现图片怀旧、浮雕、模糊、光照和素描效果
                [Android] 图像各种处理系列文章合集 (草稿 强推)
            同时算法中存在一些问题,一个就是效率不高,有好友建议C写算法来调用,但是该文章仅是课堂作业,提供一种方法供大家参考.同时在图像素描算法效果不好,锐化处理应该也不对(可参考博客),光照效果是从中心向边沿映射,用户可自己设置光照直径和方向.
                

    五. 图像相框添加

            最后是图像相框合成,如下图所示.我采用的是照相后合成图片:

        
            添加相框功能主要是通过两张图片的合成,我也见到过四张图片分别合成相框的效果.但我更喜欢这种两张图片合成的,在assets文件夹中加载透明图片.详见:
            [Android] 给图像添加相框、圆形圆角显示图片、图像合成知识

    六. 总结及感想

            该处理过程中的底部五个按钮切换背景和颜色详见代码ProcessActivity.Java,主要是通切换两张图片和背景实现.如果每个界面显示不同内容,建议使用Fragment滑动实现.参考:
            [Android] 使用Include布局+Fragment滑动切换屏幕
            [Android] 通过GridView仿微信动态添加本地图片
            随手拍我还是比较满意的,其中后台数据库我们使用的是新浪SAE做的,同时ListView刷新拍拍也非常不错!效果如下:

         
            上传的demo我把发布功能删除了,它是通过线程和Process进度条来上传多张图片的.同时ListView可以刷新最近发布消息,点击图片可以查看大图.可以对发布的拍拍进行评论、关注、点赞等操作.
            但是由于整个项目是大家一起完成,包括网络、数据库(SAE)、ListView(引用开源),所以只能共享我做的那部分.抱歉~如果有时间可以写些关于Android网络方面的文章,包括如何上传图片(URL链接存储在云盘中)、获取数据库内容等操作.
            PS:最近其实挺烦躁的,一方面这学期确实忙成狗了,寒假也还有个作业.但在火车上我还是挺平静的——听着调皮的钢琴曲,看着窗外流逝的繁华,不知道从什么时候自己已经喜欢上了这种26小时独处的感觉.感受颇多啊!另一个挺令我心烦的就是回家后不久就去做了个手指的小手术,今天写完这篇文章,心情稍微好点!蓦然回首,突然发现这辈子我最对不住的人居然是我自己,希望来年对自己有点,尤其是对自己的身体.同时有机会,找份实习吧!但幸运的是,每每分享一些博客、完成一些项目后都能给我带来一份快乐.
            希望文章对大家有所帮助~
            最后用最近看的《老人与海》结束这篇文章:
            生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方.
          (By:Eastmount 2015-2-7 夜11点   http://blog.csdn.net/eastmount/


    随时拍图像处理部分总结及源码分享 http://blog.csdn.net/eastmount/article/details/43605509


    展开全文
  • Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok没有问题,...
  • Android 仿照微信发说说,既能实现拍照,选图库,多图案上传,使用Retrofit技术。 使用方法:详见//www.jb51.net/article/103009.htm 项目的运行效果: 服务器端接收文件的action UploadFile.java @Controller ...
  • android应用程序,可以实现servlet方式的拍照然后上传图片,从相册选择图片,并且实现断点续传下载资源文件。
  • 基于Android拍照上传 程序开发     大家好,我是PETER(cfwdl)。写这篇文章是为了帮助以前没有没有接触过anroid或是刚刚入门并没有摸过手机的硬件设备监测、使用等功能的朋友,给大家一个我自己的写的...
  • 安卓开发-拍照上传源码.zip
  • 公司在最近开发中,出现,安卓开发上传相册图片功能没有问题,在上传拍照的图片时,总是异常,后经多次验证,图片拍的没有问题,权限也都动态获取了,图片也正常在手机里保存了,只是在上传接口时,出现的此类问题...
  • 安卓开发-图片拍照上传
  • 实现图片裁剪功能,从相册选择图片或使用相机拍照裁剪并上传服务器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,183
精华内容 2,473
关键字:

安卓开发拍照上传