Android - Máy ảnh
Đây là hai cách sau, trong đó bạn có thể sử dụng máy ảnh trong ứng dụng của mình
Sử dụng ứng dụng máy ảnh Android hiện có trong ứng dụng của chúng tôi
Trực tiếp sử dụng API máy ảnh do android cung cấp trong ứng dụng của chúng tôi
Sử dụng ứng dụng máy ảnh Android hiện có trong ứng dụng của chúng tôi
Bạn sẽ sử dụng MediaStore.ACTION_IMAGE_CAPTURE để khởi chạy ứng dụng máy ảnh hiện có được cài đặt trên điện thoại của bạn. Cú pháp của nó được đưa ra bên dưới
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Ngoài những điều trên, có những Ý định có sẵn khác do MediaStore cung cấp. Chúng được liệt kê như sau
Sr.No | Loại mục đích và mô tả |
---|---|
1 | ACTION_IMAGE_CAPTURE_SECURE Nó trả về hình ảnh được chụp từ máy ảnh, khi thiết bị được bảo mật |
2 | ACTION_VIDEO_CAPTURE Nó gọi ứng dụng video hiện có trong Android để quay video |
3 | EXTRA_SCREEN_ORIENTATION Nó được sử dụng để đặt hướng của màn hình thành dọc hoặc ngang |
4 | EXTRA_FULL_SCREEN Nó được sử dụng để kiểm soát giao diện người dùng của ViewImage |
5 | INTENT_ACTION_VIDEO_CAMERA Mục đích này được sử dụng để khởi chạy máy ảnh ở chế độ video |
6 | EXTRA_SIZE_LIMIT Nó được sử dụng để chỉ định giới hạn kích thước của kích thước chụp video hoặc hình ảnh |
Bây giờ bạn sẽ sử dụng hàm startActivityForResult () để khởi chạy hoạt động này và đợi kết quả của nó. Cú pháp của nó được đưa ra bên dưới
startActivityForResult(intent,0)
Phương pháp này đã được định nghĩa trong activitylớp học. Chúng tôi đang gọi nó từ hoạt động chính. Có các phương thức được định nghĩa trong lớp hoạt động thực hiện công việc tương tự, nhưng được sử dụng khi bạn không gọi từ hoạt động mà từ một nơi khác. Chúng được liệt kê bên dưới
Sr.No | Mô tả chức năng hoạt động |
---|---|
1 | startActivityForResult(Intent intent, int requestCode, Bundle options) Nó bắt đầu một hoạt động, nhưng có thể có thêm gói tùy chọn với nó |
2 | startActivityFromChild(Activity child, Intent intent, int requestCode) Nó khởi chạy hoạt động khi hoạt động của bạn là con của bất kỳ hoạt động nào khác |
3 | startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) Nó hoạt động tương tự như trên, nhưng nó có thể nhận thêm các giá trị trong hình dạng của gói với nó |
4 | startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) Nó khởi chạy hoạt động từ phân đoạn bạn hiện đang ở bên trong |
5 | startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options) Nó không chỉ khởi chạy hoạt động từ phân mảnh mà còn có thể nhận thêm giá trị với nó |
Bất kể bạn đã sử dụng chức năng nào để khởi chạy hoạt động, chúng đều trả về kết quả. Kết quả có thể nhận được bằng cách ghi đè hàm onActivityResult .
Thí dụ
Đây là một ví dụ cho thấy cách khởi chạy ứng dụng máy ảnh hiện có để chụp ảnh và hiển thị kết quả dưới dạng bitmap.
Để thử nghiệm với ví dụ này, bạn cần chạy điều này trên thiết bị thực tế có hỗ trợ máy ảnh.
Các bước | Sự miêu tả |
---|---|
1 | Bạn sẽ sử dụng Android studio IDE để tạo ứng dụng Android và đặt tên nó là Máy ảnh theo com.example.sairamkrishna.myapplication. |
2 | Sửa đổi tệp src / MainActivity.java để thêm mã ý định để khởi chạy Máy ảnh. |
3 | Sửa đổi tệp XML bố cục res / layout / activity_main.xml |
4 | Thêm quyền Máy ảnh và chạy ứng dụng và chọn một thiết bị Android đang chạy và cài đặt ứng dụng trên đó và xác minh kết quả. |
Sau đây là nội dung của tệp hoạt động chính được sửa đổi src/MainActivity.java.
package com.example.sairamkrishna.myapplication;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
public static final int MY_PERMISSIONS_REQUEST_CAMERA = 100;
public static final String ALLOW_KEY = "ALLOWED";
public static final String CAMERA_PREF = "camera_pref";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (getFromPref(this, ALLOW_KEY)) {
showSettingsAlert();
} else if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
showAlert();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
}
} else {
openCamera();
}
}
public static void saveToPreferences(Context context, String key, Boolean allowed) {
SharedPreferences myPrefs = context.getSharedPreferences(CAMERA_PREF,
Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = myPrefs.edit();
prefsEditor.putBoolean(key, allowed);
prefsEditor.commit();
}
public static Boolean getFromPref(Context context, String key) {
SharedPreferences myPrefs = context.getSharedPreferences(CAMERA_PREF,
Context.MODE_PRIVATE);
return (myPrefs.getBoolean(key, false));
}
private void showAlert() {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("App needs to access the Camera.");
alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "ALLOW",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
});
alertDialog.show();
}
private void showSettingsAlert() {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("App needs to access the Camera.");
alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//finish();
}
});
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "SETTINGS",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
startInstalledAppDetailsActivity(MainActivity.this);
}
});
alertDialog.show();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
boolean
showRationale =
ActivityCompat.shouldShowRequestPermissionRationale(
this, permission);
if (showRationale) {
showAlert();
} else if (!showRationale) {
// user denied flagging NEVER ASK AGAIN
// you can either enable some fall back,
// disable features of your app
// or open another dialog explaining
// again the permission and directing to
// the app setting
saveToPreferences(MainActivity.this, ALLOW_KEY, true);
}
}
}
}
// other 'case' lines to check for other
// permissions this app might request
}
}
@Override
protected void onResume() {
super.onResume();
}
public static void startInstalledAppDetailsActivity(final Activity context) {
if (context == null) {
return;
}
final Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);
}
private void openCamera() {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(intent);
}
}
Sau đây sẽ là nội dung của res/layout/activity_main.xml file-
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
</RelativeLayout>
Sau đây sẽ là nội dung của res/values/strings.xml để xác định một hằng số mới
<resources>
<string name="app_name">My Application</string>
</resources>
Sau đây là nội dung mặc định của AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sairamkrishna.myapplication.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Hãy thử chạy ứng dụng của bạn. Tôi giả sử bạn đã kết nối thiết bị di động Android thực tế với máy tính của mình. Để chạy ứng dụng từ android studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào
Chọn thiết bị di động của bạn làm tùy chọn, sau đó kiểm tra thiết bị di động của bạn, thiết bị này sẽ mở máy ảnh và hiển thị màn hình sau -