Android Studio:使用Camera拍照(二)自定义相机

写在前面的话:每一个实例的代码都会附上相应的代码片或者图片,保证代码完整展示。*重要的是保证例程的完整性!!!方便自己也方便他人~欢迎大家交流讨论~

1.新建一个Android项目,取名为startcamera
2.处理界面布局
2.1activity_startcamera.xml
2.2custom.xml
2.3result.xml
2.4strings.xml
3.编辑代码
3.1startcamera.java
3.2Customcamera.java
3.3ResultActivity.java
4.AndroidManifest.xml
1.新建一个Android项目,取名为startcamera
java文件:startcamera.java主文件
Customcamera.java,ResultActivity.java
layout文件:activity_startcamera.xml,custom.xml,result.xml

2.处理界面布局
2.1activity_startcamera.xml
定义一个放置开始拍照按钮的界面

<?xml version=”1.0″ encoding=”utf-8″?>
<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=”.FirstActivity”>

<Button
android:id=”@+id/button”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:onClick=”customCamera”
android:text=”@string/button_name” />

<ImageView
android:id=”@+id/iv”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />

</LinearLayout>

%title插图%num

2.2custom.xml
这个界面有拍照按钮和实时预览界面

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>

<Button
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”@string/button_name1″
android:onClick=”capture”/>

<SurfaceView
android:id=”@+id/preview”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />
</LinearLayout>

%title插图%num

2.3result.xml
这个界面用来显示拍照结果

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”match_parent”
android:layout_height=”match_parent”>
<ImageView
android:id=”@+id/pic”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />

</LinearLayout>

2.4strings.xml
<resources>
<string name=”app_name”>startcamera</string>
<string name=”button_name”>开始拍照</string>
<string name=”button_name1″>capture</string>
</resources>

3.编辑代码
3.1startcamera.java
package com.example.administrator.startcamere;

import android.app.Activity;
import android.content.Intent;
import android.view.View;

public class startcamera extends Activity {

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

public void customCamera(View view){
startActivity(new Intent(this,Customcamera.class));
}
}

3.2Customcamera.java
在这里编辑自定义相机的代码

package com.example.administrator.startcamere;

import android.app.Activity;
import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Customcamera extends Activity implements SurfaceHolder.Callback{
private Camera mCamera;
private SurfaceView mPreview;
private SurfaceHolder mHolder;
private int cameraId=1;//声明cameraId属性,ID为1调用前置摄像头,为0调用后置摄像头。此处因有特殊需要故调用前置摄像头
//定义照片保存并显示的方法
private Camera.PictureCallback mpictureCallback=new Camera.PictureCallback(){
@Override
public void onPictureTaken(byte[] data,Camera camera){
File tempfile=new File(“/sdcard/emp.png”);//新建一个文件对象tempfile,并保存在某路径中
try{ FileOutputStream fos =new FileOutputStream(tempfile);
fos.write(data);//将照片放入文件中
fos.close();//关闭文件
Intent intent=new Intent(Customcamera.this,ResultActivity.class);//新建信使对象
intent.putExtra(“picpath”,tempfile.getAbsolutePath());//打包文件给信使
startActivity(intent);//打开新的activity,即打开展示照片的布局界面
Customcamera.this.finish();//关闭现有界面
}
catch (IOException e){e.printStackTrace();}
}
};
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom);
mPreview=findViewById(R.id.preview);//初始化预览界面
mHolder=mPreview.getHolder();
mHolder.addCallback(this);
//点击预览界面聚焦
mPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(null);
}
});
}
//定义“拍照”方法
public void capture(View view){
Camera.Parameters parameters=mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);//设置照片格式
parameters.setPreviewSize(800,400);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
//摄像头聚焦
mCamera.autoFocus(new Camera.AutoFocusCallback(){
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success){mCamera.takePicture(null,null, mpictureCallback);}
}
});

}
//activity生命周期在onResume是界面应是显示状态
@Override
protected void onResume() {
super.onResume();
if (mCamera==null){//如果此时摄像头值仍为空
mCamera=getCamera();//则通过getCamera()方法开启摄像头
if(mHolder!=null){
setStartPreview(mCamera,mHolder);//开启预览界面
}
}
}
//activity暂停的时候释放摄像头
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
//onResume()中提到的开启摄像头的方法
private Camera getCamera(){
Camera camera;//声明局部变量camera
try{
camera=Camera.open(cameraId);}//根据cameraId的设置打开前置摄像头
catch (Exception e){
camera=null;
e.printStackTrace(); }
return camera;
}
//开启预览界面
private void setStartPreview(Camera camera,SurfaceHolder holder){
try{
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(90);//如果没有这行你看到的预览界面就会是水平的
camera.startPreview();}
catch (Exception e){
e.printStackTrace(); }
}
//定义释放摄像头的方法
private void releaseCamera(){
if(mCamera!=null){//如果摄像头还未释放,则执行下面代码
mCamera.stopPreview();//1.首先停止预览
mCamera.setPreviewCallback(null);//2.预览返回值为null
mCamera.release(); //3.释放摄像头
mCamera=null;//4.摄像头对象值为null
}
}
//定义新建预览界面的方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera,mHolder);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.stopPreview();//如果预览界面改变,则首先停止预览界面
setStartPreview(mCamera,mHolder);//调整再重新打开预览界面
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();//预览界面销毁则释放相机
}
}

3.3ResultActivity.java
在这里编辑照片显示的代码

package com.example.administrator.startcamere;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.widget.ImageView;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ResultActivity extends Activity {
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
String path=getIntent().getStringExtra(“picpath”);//通过值”picpath”得到照片路径
ImageView imageview=findViewById(R.id.pic);
try{FileInputStream fis=new FileInputStream(path);//通过path把照片读到文件输入流中
Bitmap bitmap=BitmapFactory.decodeStream(fis);//将输入流解码为bitmap
Matrix matrix=new Matrix();//新建一个矩阵对象
matrix.setRotate(270);//矩阵旋转操作让照片可以正对着你。但是还存在一个左右对称的问题
//新建位图,第2个参数至第5个参数表示位图的大小,matrix中是旋转后的位图信息,并使bitmap变量指向新的位图对象
bitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
//将位图展示在imageview上
imageview.setImageBitmap(bitmap);}
catch (FileNotFoundException e){e.printStackTrace();}
//Bitmap bitmap=BitmapFactory.decodeFile(path);
}
}

4.AndroidManifest.xml
新增下列代码,设置用户权限

<uses-permission android:name=”android.permission.CAMERA”/>
<uses-feature android:name=”android.hardware.Camera”/>
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>

注册activity,否则系统找不到你另外新建的两个activity会报错

<activity android:name=”.Customcamera”/>
<activity android:name=”.ResultActivity”/>

eclipse使用maven新建类目录时,提示The folder is already a source folder

 

我们有时候新建一个webapp的maven项目时,生成的目录结构是这样子的:

%title插图%num

缺少maven规范必须的src/main/java 和 src/test/java

但是当我们新建这两个目录时,却报The folder is already a source folder.这个错误,错误意思是这个目录已经存在了!

这个目录确实存在,只是missing了(不知这样说对不对)

解决办法:

右键项目 build path->configure build path

%title插图%num

 

把这两个目录删了,然后自己新建即可!)

Android Studio:使用Camera拍照(一)调用系统相机

写在前面的话:每一个实例的代码都会附上相应的代码片或者图片,保证代码完整展示。*重要的是保证例程的完整性!!!方便自己也方便他人~欢迎大家交流讨论~

(注:每处代码都会附上对应的代码片or图片)
1.新建一个Android项目,取名为startcamera。
java主文件(startcamera.java)
layout文件(activity_startcamerae.xml)

2.编辑activity_startcamerae.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<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=”.startcamera”>

<Button
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:onClick=”startCamera”
android:text=”camera”/>
</LinearLayout>

%title插图%num

%title插图%num
3.编辑startcamera.java

package com.example.administrator.startcamere;

import android.app.Activity;
import android.content.Intent;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;

public class startcamera extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_startcamera);}
public void startCamera(View view){
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
}
}

4.运行
运行模拟器or用USB连接真机开启USB调试模式即可看到执行效果

226.翻转二叉树(JS实现)

翻转二叉树(JS实现)

1 题目
翻转一棵二叉树。
示例:
输入:
4
/
2 7
/ \ /
1 3 6 9
输出:
4
/
7 2
/ \ /
9 6 3 1

链接:https://leetcode-cn.com/problems/invert-binary-tree

2 思路
这道题用递归的方法就可以做,比较简单

3代码
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var invertTree = function(root) {
function d(p) {
if (!p) return null;

let temp = p.left;
p.left = p.right;
p.right = temp;
d(p.left);
d(p.right);
}

d(root);

return root;
};

基本计算器 II(JS实现)

基本计算器 II(JS实现)

1 题目
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, – ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+22″
输出: 7
示例 2:
输入: ” 3/2 ”
输出: 1
示例 3:
输入: ” 3+5 / 2 ”
输出: 5

链接:https://leetcode-cn.com/problems/basic-calculator-ii

2 思路
这道题考察逆波兰算法,主要的思路就是先将中缀表达式转换为后缀表单式,然后再进行计算,在此过程中注意多位整数的情况

3代码
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
let stack = [];
let nums = [];
const map = {
‘*’: 1,
‘/’: 1,
‘+’: 0,
‘-‘: 0
}

let prev;
for (let alpha of s) {
if (alpha === ‘ ‘) continue;

let transformNum = temp = parseInt(alpha);
if (!isNaN(prev) && !isNaN(transformNum)) { //处理多位整数
let prevNum = nums.pop();
transformNum = prevNum * 10 + transformNum;
}
prev = temp;

if (isNaN(transformNum)) {
while(stack.length > 0 && map[stack[stack.length – 1]] >= map[alpha]) { //如果是当前符号小于栈顶符号优先级,则栈顶符号依次出栈
nums.push(stack.pop());
}
stack.push(alpha);
} else { //如果是数字直接输出
nums.push(transformNum);
}
}

nums = nums.concat(stack.reverse());
stack = [];

for (let alpha of nums) {
let transformNum = parseInt(alpha);

if (isNaN(transformNum)) {
let num2 = stack.pop();
let num1 = stack.pop();

if (alpha === ‘+’) {
stack.push(num1 + num2);
} else if (alpha === ‘-‘) {
stack.push(num1 – num2);
} else if (alpha === ‘*’) {
stack.push(num1 * num2);
} else {
stack.push(parseInt(num1 / num2));
}
} else {
stack.push(transformNum);
}
}

return stack[0];
};

求众数 II(JS实现)

求众数 II(JS实现)

1 题目
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]

链接:https://leetcode-cn.com/problems/majority-element-ii

2 思路
这道题用摩尔投票法进行解答,根据题意我们知道超过1/3的出现次数这样的数,*多出现两个,因此设置两个变量,遍历整个数组进行投票

3代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var majorityElement = function(nums) {
let len = nums.length;

if (len === 0 || len === 1) return nums;

let num1 = num2 = nums[0];
let count1 = count2 = 0;

for (let num of nums) {
if (num === num1) { //如果数字相同,得一票
count1++;
continue;
}

if (num === num2) { //如果数字相同,得一票
count2++;
continue;
}

if (count1 === 0) {
num1 = num;
count1++;
continue;
}

if (count2 === 0) {
num2 = num;
count2++;
continue;
}

count1–; //数字不同,则减一票
count2–; //数字不同,则减一票
}

count1 = count2 = 0;
for (let num of nums) {
if (num === num1) count1++;
if (num === num2) count2++;
}

const res = [];

if (count1 > len / 3) res.push(num1);
if (count2 > len / 3 && num1 !== num2) res.push(num2);

return res;
};

二叉搜索树中第K小的元素(JS实现)

二叉搜索树中第K小的元素(JS实现)

1 题目
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个*小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/
1 4

2
输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/
3 6
/
2 4
/
1
输出: 3

链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst

2 思路
这道题用递归的方法就可以做,比较简单

3代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function(root, k) {
const res = [];

function d(p) {
if (!p || res.length === k) return;
d(p.left);
res.push(p.val);
d(p.right);
}

d(root);

return res[k-1];
};

2的幂(JS实现)

2的幂(JS实现)

1 题目
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false

链接:https://leetcode-cn.com/problems/power-of-two

2 思路
这道题用位运算*快,满足2的幂,则二进制表达只有一个1,其余全为0

3代码
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
if (n <= 0) return false;
return n & (n – 1) == 0;
};

用栈实现队列(JS实现)

用栈实现队列(JS实现)

1 题目
使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false

链接:https://leetcode-cn.com/problems/implement-queue-using-stacks

2 思路
这道题思路就是用两个栈来模拟队列,当进行弹出操作时,将一个栈的元素全部弹出,再压入另一个栈,栈顶元素就为*先进入的元素

3代码
var MyQueue = function() {
this.stack1 = [];
this.stack2 = [];
};

MyQueue.prototype.push = function(x) {
this.stack1.push(x);
};

MyQueue.prototype.pop = function() {
if (this.stack2.length === 0) {
while (this.stack1.length > 0) {
this.stack2.push(this.stack1.pop());
}
}

return this.stack2.pop();
};

MyQueue.prototype.peek = function() {
if (this.stack2.length > 0) {
return this.stack2[this.stack2.length – 1];
} else {
return this.stack1[0];
}
};

MyQueue.prototype.empty = function() {
return this.stack1.length === 0 && this.stack2.length === 0;
};

回文链表(JS实现)

回文链表(JS实现)

1 题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

链接:https://leetcode-cn.com/problems/palindrome-linked-list

2 思路
这道题我给每个节点添加了prev指针,然后进行依次首尾对比

3代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
if (!head || !head.next) return true;
let tail = head;

while(tail.next) {
tail.next.prev = tail;
tail = tail.next;
}

if (head.val !== tail.val) return false;

while (tail.prev !== head && head.next !== tail && head !== tail) {
if (head.val !== tail.val) return false;
delete head.prev;
head = head.next;
tail = tail.prev;
delete tail.next.prev;
}

if (head !== tail && head.val !== tail.val) return false;

return true
};