Xamarin.Andorid 调用相机拍照
https://www.jianshu.com/p/29b349ff7f1a
第一步:XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="调用摄像头拍照"
android:textSize="20sp" />
<ImageView
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="description"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
第二步:添加权限
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
第三步:application添加内容提供者
说明:在<application></application>中,但不在<Activity></Activity>中
<!-- 为调用相机拍照设置内容提供者 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.mydemo.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
第四步:为application添加属性值
<!-- android:requestLegacyExternalStorage="true"--> <application android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:requestLegacyExternalStorage="true"
> <!-- 为调用相机拍照设置内容提供者 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.mydemo.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider> </application>
第五步:在Resources中新建文件夹xml并创建file_paths.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="my_images"
path="."/>
</paths>
第六步:activity实现
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{ public const int TAKE_PHOTO = 1;//声明一个请求码,用于识别返回的结果
private ImageView picture;
private Android.Net.Uri imageUri;
private Button CaptureButton;
private String filePath = Android.OS.Environment.ExternalStorageDirectory + File.Separator + "output_image.jpg"; protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main); RequestPermissions(LuoPermission.LuoPermissionList, 0);
CaptureButton = (Button)FindViewById(Resource.Id.take_photo);
picture = (ImageView)FindViewById(Resource.Id.picture); CaptureButton.Click += (object sender, System.EventArgs e) =>
{
TakePhoto();
}; SetDefualtImage(); }
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
} void TakePhoto()
{
requestPermission(); } //动态请求权限
private void requestPermission()
{ if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != Permission.Granted)
{
//请求权限
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.WriteExternalStorage, Manifest.Permission.Camera }, 1);
}
else
{
//调用
requestCamera();
}
}
private void requestCamera()
{
File outputImage = new File(filePath);
/*
创建一个File文件对象,用于存放摄像头拍下的图片,我们把这个图片命名为output_image.jpg
并把它存放在应用关联缓存目录下,调用getExternalCacheDir()可以得到这个目录,为什么要
用关联缓存目录呢?由于android6.0开始,读写sd卡列为了危险权限,使用的时候必须要有权限,
应用关联目录则可以跳过这一步
*/
try//判断图片是否存在,存在则删除在创建,不存在则直接创建
{
if (!outputImage.ParentFile.Exists())
{
outputImage.ParentFile.Mkdirs();
}
if (outputImage.Exists())
{
outputImage.Delete();
} outputImage.CreateNewFile(); if (Build.VERSION.SdkInt >= (BuildVersionCodes)24)
{
imageUri = FileProvider.GetUriForFile(this,
"com.example.mydemo.fileprovider", outputImage);
}
else
{
imageUri = Android.Net.Uri.FromFile(outputImage);
} //使用隐示的Intent,系统会找到与它对应的活动,即调用摄像头,并把它存储
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.PutExtra(MediaStore.ExtraOutput, imageUri);
StartActivityForResult(intent, TAKE_PHOTO);
//调用会返回结果的开启方式,返回成功的话,则把它显示出来 }
catch (IOException e)
{
e.PrintStackTrace();
} } protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
switch (requestCode)
{
case TAKE_PHOTO:
if (resultCode == Result.Ok)
{
try
{ Bitmap bitmap = BitmapFactory.DecodeStream(ContentResolver.OpenInputStream(imageUri));
picture.SetImageBitmap(bitmap);
//将图片解析成Bitmap对象,并把它显现出来
}
catch (FileNotFoundException e)
{
e.PrintStackTrace();
}
}
break;
default:
break;
}
} //处理返回结果的函数,下面是隐示Intent的返回结果的处理方式,具体见以前我所发的intent讲解
public override void OnActivityReenter(int resultCode, Intent data)
{
base.OnActivityReenter(resultCode, data); } //设置保存拍照图片——>再次关闭app重新打开显示为上次拍照照片
private void SetDefualtImage()
{
File outputImage = new File(filePath);
if (!outputImage.Exists())
{
return;
}
picture.SetImageBitmap(BitmapFactory.DecodeFile(filePath));
} }
Github 地址:https://github.com/LuoCoreTestDeom/Android-PaiZhao-Photograph
不能放在gitee :因为这个东西太坑了,比github 还要坑,C坑C 是最狠的,比老美狠多了
Xamarin.Andorid 调用相机拍照的更多相关文章
- Android调用相机拍照并返回路径和调用系统图库选择图片
		
调用系统图库: Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ...
 - 解决Android调用相机拍照,要报“打开相机失败”查看debug日志显示“setParameters failed”的问题
		
使用CameraLibrary项目,在部分手机或平板上不能正常使用,要报“打开相机失败”查看debug日志显示“setParameters failed”. 找到CameraView.java中的se ...
 - android 调用相机拍照及相册
		
调用系统相机拍照: private Button btnDyxj; private ImageView img1; private File tempFile; btnDyxj = (Button) ...
 - Xamarin.Android 调用手机拍照功能
		
最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-- ...
 - 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
		
一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...
 - Android7.0调用系统相机拍照、读取系统相册照片+CropImageView剪裁照片
		
Android手机拍照.剪裁,并非那么简单 简书地址:[我的简书–T9的第三个三角] 前言 项目中,基本都有用户自定义头像或自定义背景的功能,实现方法一般都是调用系统相机–拍照,或者系统相册–选择照片 ...
 - Android调用相机实现拍照并裁剪图片,调用手机中的相冊图片并裁剪图片
		
在 Android应用中,非常多时候我们须要实现上传图片,或者直接调用手机上的拍照功能拍照处理然后直接显示并上传功能,以下将讲述调用相机拍照处理图片然后显示和调用手机相冊中的图片处理然后显示的功能,要 ...
 - android调用照相机拍照获取照片并做简单剪裁
		
引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html 效果: 客服端代码: package com.cn.lx ...
 - Android调用系统拍照裁剪和选图功能
		
最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照 private fun openCamera() { //调用相机拍照 // 创建File对象,用于存储拍照后的 ...
 - Android下载图片/调用系统相机拍照、显示并保存到本地
		
package com.example.testhttpget; import java.io.BufferedReader; import java.io.FileNotFoundException ...
 
随机推荐
- 【服务器】npm配置国内镜像源
			
[服务器]npm配置国内镜像源 零.问题 配置Node.js的HTTPS的时候,下载不了 一.解决 这里使用的是淘宝的镜像: npm config set registry https://regis ...
 - postgresql的日期函数
			
一个to_char干完所有的活.包括日期的转换 函数 返回类型 描述 实例 to_char(timestamp, text) text 将时间戳转换为字符串 to_char(current_times ...
 - Linux | 如何创建一个 home 目录在 /data 磁盘的 sudo 用户
			
需求: 拿到了 boss 的服务器账号 ssh boss@172.16.1.100,需要登录 boss 的账号,然后为自己创建一个账号,实现 ssh <user_name>@172.16. ...
 - Asp.net mvc基础(一):Razor语法
			
1.使用@{C#代码区域},调用@C#代码 2.使用@调用foreach,for,if等语句 2.在foreach,for,if等语句中使用汉字会报错,原因是在代码中纯文字会被认为是C#代码 如下: ...
 - 前端js需要连接后端c#的wss服务
			
背景前端js需要连接后端wss服务 前端:js后端:c# - 控制台搭建wss服务器 步骤1 wss需要ssl认证,所以需要个证书,随便找一台linux的服务器(windows的话,自己安装下open ...
 - EFCore先DBFirst,再CodeFirst(针对老项目迁移)
			
参照文章: CodeFirst命令介绍:Scaffold-DbContext 命令使用 - 跟着阿笨一起玩.NET - 博客园 (cnblogs.com) 整体流程介绍:NetCore 中 EFcor ...
 - Mysql如何给字符串添加索引(前缀索引)
			
在日常开发中,我们经常给字符串添加索引,那么给字段添加索引有什么技巧吗,我们看看下面的例子,我们给一个邮箱添加索引,应该如何添加呢 看看下面这条sql select * from user where ...
 - dbeaver导入sql脚本报错的排查—— ERROR 1366 (HY000) at line
			
描述 在使用dbeaver进行sql脚本导入的时候报了以下的错误. C:\Users\xxxx\AppData\Roaming\DBeaverData\drivers\clients\mysql_8\ ...
 - 【记录】PR使用技巧记录
			
@ 目录 [PR最重要的两个操作] 一.关键帧 1. 如何设置关键帧? 2. 应用实例 1)1s内视频从明变暗 2)1s内视频画面由大到小 二.入点.出点 [其他] PR批量调整视频效果 PR剪视频片 ...
 - 【MOOC】华中科技大学计算机组成原理慕课答案-第五章-指令系统测试
			
1 以下四种类型指令中,执行时间最长的是( ) (单选) A. 程序控制类指令 B. RR型指令 C. RS型指令 √D. SS型指令 SS型指令是两个操作数都存在主存中,慢. 2 程序控制类指令的功 ...