public class MainActivity extends AppCompatActivity {
Uri imgUri;
//拍照后存盘的Uri的对象
ImageView imv;
//ImageView 对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);//设置屏幕不许旋转
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置屏幕直向显示
imv = (ImageView) findViewById(R.id.imageView);
//引用ImageView的组件
}
//按钮按下后的方法
public void onGet(View v){
if(ActivityCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED){
//目的就是检查是否已获取写入的权限,此时表明是未获取权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
}
else{
//已经获取了权限
getPhoto();
}
}
//写一个方法用于接受用户允许或者拒绝权限的结果
public void onRequestPermissionsResult(int requestCode,
String[] permission,int[] grantResults){
if(requestCode == 200){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
getPhoto();
}
}
else {
Toast.makeText(this,"需要获取权限才可以运行",Toast.LENGTH_LONG).show();
}
}
private void getPhoto(){
imgUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new ContentValues());
Intent it = new Intent("android.media.action.IMAGE_CAPTURE");
//拍照并储存到一个路径中去
it.putExtra(MediaStore.EXTRA_OUTPUT,imgUri);
//将uri加到拍照Intent的额外数据
startActivityForResult(it,100);
//启动并返回数据
}
protected void onActivityResult (int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(resultCode == Activity.RESULT_OK ){
switch (requestCode){
case 100://拍照
Intent it = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,imgUri);
//设为系统共享媒体文件
sendBroadcast(it);//用广播的形式来将intent传送给系统
break;
case 101://选取照片
imgUri = data.getData();//获取选取照片的Uri并进行格式转换
break;
}
showImg();//显示图片
}
else{
Toast.makeText(this,"没有拍到照片",Toast.LENGTH_LONG).show();
}
}
public void onPick(View v){
Intent it = new Intent(Intent.ACTION_GET_CONTENT);//获取内容
it.setType("image/*");//设置要选取的媒体类型:所有类型的图片
startActivityForResult(it,101);
}
public void share(){
//先判断是否imguri为空
if(imgUri != null ){
Intent it = new Intent(Intent.ACTION_SEND);
it.setType("image/*");
it.putExtra(Intent.EXTRA_STREAM,imgUri);
startActivity(it);
}
}
void showImg(){
int iw,ih,vw,vh;
boolean needRotate;//此变量用于存储是否需要旋转
BitmapFactory.Options option = new BitmapFactory.Options();
//创建一个选项对象
option.inJustDecodeBounds = true;
//设置选项,只读不载入
try{
//这个是一个错误处理机制
BitmapFactory.decodeStream(
getContentResolver().openInputStream(imgUri), null,option);
}catch (IOException e){
Toast.makeText(this,"读取照片时发生错误",Toast.LENGTH_LONG).show();
return;
}
iw = option.outWidth;//读出图像文件宽度
ih = option.outHeight;//读出图像文件高度
vw = imv.getWidth();//获取imageview的宽度
vh = imv.getHeight();//获取imageview的高度
//int scaleFactor = Math.min(iw/vw,ih/vh);
int scaleFactor;
if(iw < ih){
needRotate = false;//不需要旋转
scaleFactor = Math.min(iw/vw, ih/vh);//计算缩小比率
}
else{
needRotate = true;//需要旋转
scaleFactor = Math.min(ih/vw, iw/vh);//改用旋转后的图像宽、高计算缩小比例
}
option.inJustDecodeBounds = false;//关闭只读的选项
option.inSampleSize = scaleFactor;//设置缩小比例,若为3,则长宽都将缩小为原来的1/3
Bitmap bmp = null;
try{
//由于uri可能出错,这个是一个错误处理机制
bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUri),
null,option);
}catch (IOException e){
Toast.makeText(this,"无法读取照片",Toast.LENGTH_LONG).show();
}
if (needRotate){//如果需要旋转
Matrix matrix = new Matrix();//创建一个新的Matrix对象
matrix.postRotate(90);//设置旋转角度
bmp = Bitmap.createBitmap(bmp,340,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
}
imv.setImageBitmap(bmp);
//将Bitmap对象显示在ImageView中*/
}
}
在app中完成拍照并显示,并且也可以通过选择相册来选择图像来显示
猜你喜欢
转载自blog.csdn.net/weixin_41938314/article/details/80826843
今日推荐
周排行