●カメラ

まずはカメラを使用する権限を取得する必要があります。
MyApplication?\app\src\main\AndroidManifest.xml
この場所にある、AndroidManifest.xmlファイルを開きます。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.myapplication">
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

赤文字の部分を追加してカメラの権限をアプリに与えます。

しかし、Android6.0以降は、Dangerous Permissionのためこのままでは動きません。
アプリ起動後にユーザーに権限を許可してもらう必要があります。
対応するには下の方を見てください。


■最低限の画像を表示するカメラアプリ

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new _view(this));
    }

    public class _view extends android.view.SurfaceView implements android.view.SurfaceHolder.Callback {
        private android.hardware.Camera camera;

        _view(android.content.Context context) {
            super(context);
            android.view.SurfaceHolder holder;
            holder = getHolder();
            holder.addCallback(this);
        }

        @Override
        public void surfaceCreated(android.view.SurfaceHolder holder) {
            camera = android.hardware.Camera.open();
            try {
                camera.setPreviewDisplay(holder);
            }catch(Exception e){
            }
            camera.startPreview();
        }

        @Override
        public void surfaceChanged(android.view.SurfaceHolder holder, int format, int width, int height) {
        }

        @Override
        public void surfaceDestroyed(android.view.SurfaceHolder holder) {
            camera.stopPreview();
            camera.release();
        }
    }
}

画像の向きや縮尺などはおかしいですが、何はともあれカメラの画像が表示されるはずです。


■Dangerous Permissionに対応する

android6.0以前はインストールする段階で権限を取得できましたが、android6.0では実行時に権限を取得するように改良されました。
そのため、Android6.0以降は権限を取得するコードを書かないと例外が発生してしまい、このままでは動きません。
実行時に権限を取得するには次のようにする必要があります。

final int REQUEST_ID = 99;
void permission(String permission){
    //android version 6.0以上の場合は実行する必要がある
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
        //権限が許可されてない場合には
        if (android.support.v4.app.ActivityCompat.checkSelfPermission(this, permission)!= android.content.pm.PackageManager.PERMISSION_GRANTED){
            //権限をリクエストする
            android.support.v4.app.ActivityCompat.requestPermissions(this, new String[]{permission}, REQUEST_ID);
        }
    }
}
//権限のリクエスト結果が返ってくる
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_ID) {
        if (grantResults[0] != android.content.pm.PackageManager.PERMISSION_GRANTED) {
            //権限が許可されなかった
            android.widget.Toast.makeText(getApplicationContext(), "権限が許可されませんでした\nアプリを終了します。", android.widget.Toast.LENGTH_LONG).show();
            //アプリを終了する
            finish();
            moveTaskToBack(true);
        }
    }
}
上の関数を追加した上で、権限を取得するタイミングで、次の関数をコールします

        //カメラの権限をユーザーから取得する
        permission(android.Manifest.permission.CAMERA);
android6.0以上で関数をコールするとこのようなメッセージボックスが表示されます。



カメラを使用する前に権限を取得することによりandroid6.0以降でも例外が発生しなくなります。


▲トップページ > android