Android——Carema的使用
2015-09-15 22:35
375 查看
相机可以自己编写,也可以调用系统的相机,此处我们是调用系统相机
使用camera要先加权限
GetPathFromUri4kitkat ,4.4以上版本通过Uri获得文件路径的方法
MainActivity
使用camera要先加权限
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
实例
布局文件<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/btn_camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="调用系统相机"/> <ImageView android:id="@+id/imageview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
GetPathFromUri4kitkat ,4.4以上版本通过Uri获得文件路径的方法
package com.example.administrator.mycamera; import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; /** * Created by Administrator on 2015/9/16. */ public class GetPathFromUri4kitkat { /** * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使 * 若为4.4以下版本此方法忽略 */ @SuppressLint("NewApi") public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context * The context. * @param uri * The Uri to query. * @param selection * (Optional) Filter used in the query. * @param selectionArgs * (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri * The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri * The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri * The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } }
MainActivity
package com.example.administrator.mycamera; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mBtnCamera; private ImageView imageView; private File file; private Button mBtnGetGallery; private static final int GET_GALLERY=0x24; private static final int TAKE_PICTURE=0x23; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnCamera= (Button) findViewById(R.id.btn_camera); imageView= (ImageView) findViewById(R.id.imageview); mBtnCamera.setOnClickListener(this); mBtnGetGallery= (Button) findViewById(R.id.btn_get_gallery); mBtnGetGallery.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_camera: Intent intent=new Intent(); //隐式启动系统相机 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //创建照片的存储位置及文件名 file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } //告诉相机保存照片的位置 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); //开始启动 startActivityForResult(intent,TAKE_PICTURE); break; case R.id.btn_get_gallery: Intent intentFromGallery = new Intent(); intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); intentFromGallery.setType("image/*"); startActivityForResult(intentFromGallery,GET_GALLERY); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode==RESULT_OK){ //得到图片 switch (requestCode){ case TAKE_PICTURE: //某些手机不能显示大图片,故此处调用将图片压缩的方法 zipImage(file.getAbsolutePath()); imageView.setImageURI(Uri.fromFile(file)); break; case GET_GALLERY: Uri uri=data.getData(); //调用获得4.4版本以上由Uri获得文件路径的方法 File file1=new File(GetPathFromUri4kitkat.getPath(MainActivity.this,uri)) ; //调用压缩图片的方法对文件进行压缩 zipImage(file1.getAbsolutePath()); //将图片设置到imageView上 imageView.setImageURI(Uri.fromFile(file1)); // imageView.setImageURI(uri); break; }} } /** * 压缩图片的方法 * @param savePath */ private void zipImage(String savePath) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(savePath, options); options.inSampleSize = computeInitialSampleSize(options, 480, 480 * 960); options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(savePath, options); try { FileOutputStream fos = new FileOutputStream(savePath); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } bitmap.recycle(); bitmap = null; System.gc(); } public int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math .sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } }
相关文章推荐
- Android 多媒体应用——SoundPool音频播放
- Android Handler
- Android studio中使用fastjson
- android中onKeyDown()事件的分析
- 0915Android基础SurfaceView
- Android之MediaPlayer——SurfaceView的简单使用
- 调研Android开发环境的发展演变
- Android之MediaPlayer——VideoView
- Android使用Activity用作弹出式对话框
- Android多媒体---VideoView(播放视频)
- 0915Android基础VideoView
- android SDK 升级24.0.2的方法总结
- Android多媒体---SurfaceView(播放视频)+Mediaplayer(音频)
- Android 内存泄漏的原因
- Android error 之 Syntax error, insert ";" to complete Local Variable Declaration Statement
- Android多媒体---MediaRecorder
- Android SDK Manager不能显示所有包的解决办法
- Android 多媒体应用——MediaPlayer音频播放
- Handler线程间通信
- Android多媒体---Camera(调用系统Camera,非自定义)