Android 打开相机,相册

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.photo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toPhoto();
            }
        });

        findViewById(R.id.camear).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toCamera();
            }
        });
        cache();

      }

   
    public static final MediaType MEDIA_TYPE_MARKDOWN
            = MediaType.parse("text/x-markdown; charset=utf-8");
    public void cache(){

        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    int cacheSize = 10 * 1024 * 1024; // 10 MiB
                    Cache cache = new Cache(getCacheDir(), cacheSize);

                    OkHttpClient client = new OkHttpClient.Builder()
                            .addInterceptor(new LoggingInterceptor())
                            .cache(cache)
                            .build();
                    Request request = new Request.Builder()
                            .cacheControl(CacheControl.FORCE_NETWORK)
                            .url("http://publicobject.com/helloworld.txt")
                            .build();

                    String response1Body;
                    Response response1 = client.newCall(request).execute();
//        () {
                    if (!response1.isSuccessful()) throw new IOException("Unexpected code " + response1);

                    response1Body = response1.body().string();
                    System.out.println("Response 1 response:          " + response1);
                    System.out.println("Response 1 cache response:    " + response1.cacheResponse());
                    System.out.println("Response 1 network response:  " + response1.networkResponse());
                    

                }catch (Exception e) {

                }


            }
        }).start();



    }

    public void getData() {
        new Thread() {
            @Override
            public void run() {
                //异步请求数据
                try {
                    OkHttpClient client = new OkHttpClient();

                    Request request = new Request.Builder().url("http://japi.juhe.cn/comic/category?key=2370611574de813d66e89eaedc7bf903").build();

                    Call call = client.newCall(request);

                    Response response = call.execute();

                    if (response.isSuccessful()) {
                        String string = response.body().string();
                        System.out.println("result:" + string);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }.start();
    }


    public void getDataAsyn() {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder().url("http://japi.juhe.cn/comic/category?key=2370611574de813d66e89eaedc7bf903").build();

        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String string = response.body().string();
                System.out.println("string = " + string);
            }
        });
    }

    static final int INTENTFORCAMERA = 1;
    static final int INTENTFORPHOTO = 2;


    public String LocalPhotoName;

    public String createLocalPhotoName() {
        LocalPhotoName = System.currentTimeMillis() + "face.jpg";
        return LocalPhotoName;
    }

    public void postFile(File file) {


        //  sdcard/dliao/aaa.jpg
        String path = file.getAbsolutePath();

        String[] split = path.split("\\/");


        MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");


        OkHttpClient client = new OkHttpClient();

        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
//                file
                .addFormDataPart("imageFileName", split[split.length - 1])
                .addFormDataPart("image", split[split.length - 1], RequestBody.create(MEDIA_TYPE_PNG, file))
                .build();


        Request request = new Request.Builder().post(requestBody).url("http://qhb.2dyt.com/Bwei/upload").build();


        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {


                System.out.println("response = " + response.body().string());

            }
        });


    }

    public static void copyStream(InputStream inputStream, OutputStream outStream) throws Exception {
        try {
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            outStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outStream != null) {
                outStream.close();
            }
        }

    }

    /**
     * 打开相册
     */
    public void toPhoto() {
        try {
            createLocalPhotoName();
            Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
            getAlbum.setType("image/*");
            startActivityForResult(getAlbum, INTENTFORPHOTO);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void toCamera(){
        try {
            Intent intentNow = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            Uri uri = null ;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //针对Android7.0,需要通过FileProvider封装过的路径,提供给外部调用
                uri = FileProvider.getUriForFile(MainActivity .this, "com.bw.dliao", SDCardUtils.getMyFaceFile(createLocalPhotoName()));//通过FileProvider创建一个content类型的Uri,进行封装
            }else {
              uri = Uri.fromFile(SDCardUtils.getMyFaceFile(createLocalPhotoName())) ;
            }
            intentNow.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            startActivityForResult(intentNow, INTENTFORCAMERA);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case INTENTFORPHOTO:
                //相册
                try {
                    // 必须这样处理,不然在4.4.2手机上会出问题
                    Uri originalUri = data.getData();
                    File f = null;
                    if (originalUri != null) {
                        f = new File(SDCardUtils.photoCacheDir, LocalPhotoName);
                        String[] proj = {MediaStore.Images.Media.DATA};
                        Cursor actualimagecursor = this.getContentResolver().query(originalUri, proj, null, null, null);
                        if (null == actualimagecursor) {
                            if (originalUri.toString().startsWith("file:")) {
                                File file = new File(originalUri.toString().substring(7, originalUri.toString().length()));
                                if (!file.exists()) {
                                    //地址包含中文编码的地址做utf-8编码
                                    originalUri = Uri.parse(URLDecoder.decode(originalUri.toString(), "UTF-8"));
                                    file = new File(originalUri.toString().substring(7, originalUri.toString().length()));
                                }
                                FileInputStream inputStream = new FileInputStream(file);
                                FileOutputStream outputStream = new FileOutputStream(f);
                                copyStream(inputStream, outputStream);
                            }
                        } else {
                            // 系统图库
                            int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                            actualimagecursor.moveToFirst();
                            String img_path = actualimagecursor.getString(actual_image_column_index);
                            if (img_path == null) {
                                InputStream inputStream = this.getContentResolver().openInputStream(originalUri);
                                FileOutputStream outputStream = new FileOutputStream(f);
                                copyStream(inputStream, outputStream);
                            } else {
                                File file = new File(img_path);
                                FileInputStream inputStream = new FileInputStream(file);
                                FileOutputStream outputStream = new FileOutputStream(f);
                                copyStream(inputStream, outputStream);
                            }
                        }
                        Bitmap bitmap = ImageResizeUtils.resizeImage(f.getAbsolutePath(), 1080);
                        int width = bitmap.getWidth();
                        int height = bitmap.getHeight();
                        FileOutputStream fos = new FileOutputStream(f.getAbsolutePath());
                        if (bitmap != null) {

                            if (bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos)) {
                                fos.close();
                                fos.flush();
                            }
                            if (!bitmap.isRecycled()) {
                                bitmap.isRecycled();
                            }

                            System.out.println("f = " + f.length());
                            postFile(f);

                        }

                    }
                } catch (Exception e) {
                    e.printStackTrace();

                }
                break;
            case INTENTFORCAMERA:
//                相机
                try {

                    //file 就是拍照完 得到的原始照片
                    File file = new File(SDCardUtils.photoCacheDir, LocalPhotoName);
                    Bitmap bitmap = ImageResizeUtils.resizeImage(file.getAbsolutePath(), 1080);
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());
                    if (bitmap != null) {
                        if (bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos)) {
                            fos.close();
                            fos.flush();
                        }
                        if (!bitmap.isRecycled()) {
                            //通知系统 回收bitmap
                            bitmap.isRecycled();
                        }
                        System.out.println("f = " + file.length());

                        postFile(file);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }


                break;
        }
    }
}


public class ImageResizeUtils {


    /**
     * 照片路径
     * 压缩后 宽度的尺寸
     * @param path
     * @param specifiedWidth
     */
    public static Bitmap resizeImage(String path, int specifiedWidth) throws Exception {


        Bitmap bitmap = null;
        FileInputStream inStream = null;
        File f = new File(path);
        System.out.println(path);
        if (!f.exists()) {
            throw new FileNotFoundException();
        }
        try {
            inStream = new FileInputStream(f);
            int degree = readPictureDegree(path);
            BitmapFactory.Options opt = new BitmapFactory.Options();
            //照片不加载到内存 只能读取照片边框信息
            opt.inJustDecodeBounds = true;
            // 获取这个图片的宽和高
            decodeFile(path, opt); // 此时返回bm为空



            int inSampleSize = 1;
            final int width = opt.outWidth;
//           width 照片的原始宽度  specifiedWidth 需要压缩的宽度
//            1000 980
            if (width > specifiedWidth) {
                inSampleSize = (int) (width / (float) specifiedWidth);
            }
            // 按照 565 来采样 一个像素占用2个字节
            opt.inPreferredConfig = Bitmap.Config.RGB_565;
//            图片加载到内存
            opt.inJustDecodeBounds = false;
            // 等比采样
            opt.inSampleSize = inSampleSize;
//            opt.inPurgeable = true;
            // 容易导致内存溢出
            bitmap = BitmapFactory.decodeStream(inStream, null, opt);
            // bitmap = BitmapFactory.decodeFile(path, opt);
            if (inStream != null) {
                try {
                    inStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    inStream = null;
                }
            }

            if (bitmap == null) {
                return null;
            }
            Matrix m = new Matrix();
            if (degree != 0) {
                //给Matrix 设置旋转的角度
                m.setRotate(degree);
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
            }
            float scaleValue = (float) specifiedWidth / bitmap.getWidth();
//            等比压缩
            m.setScale(scaleValue, scaleValue);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
            return bitmap;
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }


    }


    /**
     * 读取图片属性:旋转的角度
     *
     * @param path 源信息
     *            图片绝对路径
     * @return degree旋转的角度
     */
    public static int readPictureDegree(String path) {
        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return degree;
    }


    public static void copyStream(InputStream inputStream, OutputStream outStream) throws Exception {
        try {
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            outStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){
                inputStream.close();
            }
            if(outStream != null){
                outStream.close();
            }
        }

    }

}
lass LoggingInterceptor implements Interceptor {
  @Override public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();

    long t1 = System.currentTimeMillis();


    Response response = chain.proceed(request);

    long t2 = System.currentTimeMillis();

    System.out.println("t2 = " +( t2-t1));


    return response;
  }
}

 
public class SDCardUtils {


   public static final String DLIAO = "dliao" ;

   public static File photoCacheDir = SDCardUtils.createCacheDir(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + DLIAO);
   public static String cacheFileName = "myphototemp.jpg";



   public static boolean isSDCardExist() {
      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
         return true;
      } else {
         return false;
      }
   }

   public static void delFolder(String folderPath) {
      try {
         delAllFile(folderPath);
         String filePath = folderPath;
         filePath = filePath.toString();
         File myFilePath = new File(filePath);
         myFilePath.delete();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static boolean delAllFile(String path) {
      boolean flag = false;
      File file = new File(path);
      if (!file.exists()) {
         return flag;
      }
      if (!file.isDirectory()) {
         return flag;
      }
      String[] tempList = file.list();
      File temp = null;
      for (int i = 0; i < tempList.length; i++) {
         if (path.endsWith(File.separator)) {
            temp = new File(path + tempList[i]);
         } else {
            temp = new File(path + File.separator + tempList[i]);
         }
         if (temp.isFile()) {
            temp.delete();
         }
         if (temp.isDirectory()) {
            delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
            delFolder(path + "/" + tempList[i]);// 再删除空文件夹
            flag = true;
         }
      }
      return flag;
   }

   public static boolean deleteOldAllFile(final String path) {
      try {
         new Thread(new Runnable() {

            @Override
            public void run() {
               delAllFile(Environment.getExternalStorageDirectory() + File.separator + DLIAO);
            }
         }).start();

      } catch (Exception e) {
         e.printStackTrace();
         return false;
      }
      return true;
   }

   /**
    * 给定字符串获取文件夹
    * 
    * @param dirPath
    * @return 创建的文件夹的完整路径
    */
   public static File createCacheDir(String dirPath) {
      File dir = new File(dirPath);;
      if(isSDCardExist()){
         if (!dir.exists()) {
            dir.mkdirs();
         }
      }
      return dir;
   }

   public static File createNewFile(File dir, String fileName) {
      File f = new File(dir, fileName);
      try {
         // 出现过目录不存在的情况,重新创建
         if (!dir.exists()) {
            dir.mkdirs();
         }
         f.createNewFile();
      } catch (IOException e) {
         e.printStackTrace();
      }
      return f;
   }

   public static File getCacheFile() {
      return createNewFile(photoCacheDir, cacheFileName);
   }

   public static File getMyFaceFile(String fileName) {
      return createNewFile(photoCacheDir, fileName);
   }

   /**
    * 获取SDCARD剩余存储空间
    *
    * @return 0 sd已被挂载占用  1 sd卡内存不足 2 sd可用
    */
   public static int getAvailableExternalStorageSize() {
      if (isSDCardExist()) {
         File path = Environment.getExternalStorageDirectory();
         StatFs stat = new StatFs(path.getPath());
         long blockSize = stat.getBlockSize();
         long availableBlocks = stat.getAvailableBlocks();
         long memorySize = availableBlocks * blockSize;
         if(memorySize < 10*1024*1024){
            return 1;
         }else{
            return 2;
         }
      } else {
         return 0;
      }
   }
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值