9

Androidintentで開くためcameraに使用したい。

私は次のコードbuttonを使用しましたが、 (アクションが関数である)を押すとonclick()、アプリは自動的に閉じます。

 public void onclick(int actionCode){
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
     startActivityForResult(takePictureIntent, actionCode);
} 
public static boolean isIntentAvailable(Context context, String action) { 
    final PackageManager packageManager = context.getPackageManager(); 
    final Intent intent = new Intent(action); 
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0;
}

誰かが私を助けることができれば。

4

7 に答える 7

10
File destination;
Uri selectedImage;
public static String selectedPath1 = "NONE";
private static final int PICK_Camera_IMAGE = 2;
private static final int SELECT_FILE1 = 1;
public static Bitmap bmpScale;
public static String imagePath;



    mcamera = (Button) findViewById(R.id.button1);
    mcamera.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            String name = dateToString(new Date(), "yyyy-MM-dd-hh-mm-ss");
            destination = new File(Environment
                    .getExternalStorageDirectory(), name + ".jpg");

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(destination));
            startActivityForResult(intent, PICK_Camera_IMAGE);

        }
    });

    // ......................gallery_function..........//
    mgallery = (Button) findViewById(R.id.button2);
    mgallery.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            openGallery(SELECT_FILE1);
        }
    });

インテントのため // ....................ギャラリー機能 ..//

    public void openGallery(int SELECT_FILE1) {

    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(
            Intent.createChooser(intent, "Select file to upload "),
            SELECT_FILE1);

}

//........ 意図 .........

                // ..................
protected void onActivityResult(int requestCode, int resultCode,
        Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    Uri selectedImageUri = null;
    String filePath = null;
    switch (requestCode) {
    case SELECT_FILE1:
        if (resultCode == Activity.RESULT_OK) {
            selectedImage = imageReturnedIntent.getData();

            if (requestCode == SELECT_FILE1) {
                selectedPath1 = getPath(selectedImage);
                // mimagepath.setText(selectedPath1);
                // Toast.makeText(Camera.this, "" + selectedPath1 + "",
                // 500).show();

                if (selectedPath1 != null) {

                    BitmapFactory.Options options = new BitmapFactory.Options();

                    options.inJustDecodeBounds = true;
                    // image path `String` where your image is located
                    BitmapFactory.decodeFile(selectedPath1, options);



                // Log.d("setpath ", "setpath " + selectedPath1);
                ;

            }
        }

        break;
    case PICK_Camera_IMAGE:
        if (resultCode == RESULT_OK) {

            try {
                in = new FileInputStream(destination);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 4;
            imagePath = destination.getAbsolutePath();

            // Toast.makeText(Camera.this, "" + imagePath +
            // "",Toast.LENGTH_LONG).show();

        break;

    }

}
于 2013-05-29T13:31:01.420 に答える
5

このコードを試してください

public static final int CAMERA_PIC_REQUEST = 1;//firstly define this 



Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
                    startActivityForResult(photo, CAMERA_PIC_REQUEST);
于 2014-06-12T15:39:02.940 に答える
2

「オンクリック」メソッドに渡されたパラメーターは、表示されているタイプではありViewませんint

このチュートリアルによると、onClick メソッドは次のようになります。

public void onclick( View v ){
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
     startActivityForResult(takePictureIntent, CAMERA_PIC_REQUEST);
}

WhereCAMERA_PIC_REQUESTは次のように定義されています (ただし、アプリケーションでこの値を静的にハードコーディングする必要がある理由はよくわかりません)。

private static final int CAMERA_PIC_REQUEST = 1337;  


アップデート

CAMERA_PIC_REQUESTに返される結果を一意に識別するために使用されonActivityResultます。一度に複数startActivityForResultのリクエストが未処理になる可能性があります。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_PIC_REQUEST) { 
        if (resultCode == RESULT_OK) {
            tv.setText("Got picture!");
            imageData = (Bitmap) data.getExtras().get("data"); 
            ImageView image = (ImageView) findViewById(R.id.imageView1);
            image.setImageBitmap(imageData);
        } else if (resultCode == RESULT_CANCELED){
            tv.setText("Cancelled");
        }
    }  
} 
于 2013-05-28T19:53:07.833 に答える
1

私はこの質問が古くて答えられていることを知っていますが、画像ファイルを取得する方法を尋ねている人のために? これが解決策です。

String ExternalStorageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath();
String targetPath = ExternalStorageDirectoryPath + "/DCIM/Camera";

File targetDirector = new File(targetPath);
File[] files = targetDirector.listFiles()

String ImagePath = files[ file.files-1 ].getAbsolutePath();

Bitmap bmp = BitmapFactory.decodeFile(pathName); 
ivImage.setImageBitmap( bmp );

また、マニフェスト ファイルにカメラのアクセス許可を追加する必要はありません。

-これが役に立ったら乾杯して投票してください

-幸せなコーディング..

于 2014-11-21T01:39:57.487 に答える
1

Android アプリからカメラを起動するのは非常に簡単です。onClickメソッドに 2 行のコードを記述するだけです。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, CAMERA_PIC_REQUEST );

クラスに 1 つの定数フィールドを追加します (7 の代わりに任意の乱数を使用できます)。

private int CAMERA_PIC_REQUEST = 7;
于 2015-10-27T10:24:27.893 に答える
0

多くの調査の後、私はこの解決策を見つけました。明確にするために、この質問のためにアプリ全体を作成しました。これは、写真をクリックしてカメラを開き、画像を ImageView の ImageBitmap として設定する目的に役立ちます。この質問で尋ねられたコードは、2 番目のブロック、つまり onCreate() メソッドの下にある setView() メソッドから始まり、その後に onActivityResult() メソッドがあります。

アプリのデモはこちら。

デモンストレーション

以下に MainActivity.java ファイルを添付しました

package com.cr7.opencamera;

import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private Button buttonCaptureImageFromCamera;
    private Uri imageUri;
    private ImageView imageViewCameraImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Button that will open the camera
        buttonCaptureImageFromCamera = findViewById(R.id.buttonCaptureImageFromCamera);
        // ImageView that will store the image
        imageViewCameraImage = findViewById(R.id.imageViewCameraImage);
        askPermission();
    }

ここで imageUri はグローバル変数であるため、 onActivityResult() メソッドで使用できます

    // Sets OnClickListener for the button if storage permission is given
    private void setView() {
        buttonCaptureImageFromCamera.setOnClickListener(v -> {
            String fileName = "new-photo-name.jpg";
            // Create parameters for Intent with filename
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, fileName);
            values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");
            imageUri =
                    getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            values);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(intent, 1231);
        });
    }

これは onActivityResult メソッドです。ここでは imageUri を使用しました。つまり、上記の setView() メソッドのボタンの OnClickListener で初期化された Uri 型のグローバル変数です。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1231 && resultCode == Activity.RESULT_OK) {
            try {
                ContentResolver cr = getContentResolver();
                try {
                    // Creating a Bitmap with the image Captured
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(cr, imageUri);
                    // Setting the bitmap as the image of the
                    imageViewCameraImage.setImageBitmap(bitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (IllegalArgumentException e) {
                if (e.getMessage() != null)
                    Log.e("Exception", e.getMessage());
                else
                    Log.e("Exception", "Exception");
                e.printStackTrace();
            }
        }
    }

残りのコード...


    // Asking user for storage permission
    public void askPermission() {
        // Checking if the permissions are not granted.
        if (
                ContextCompat.checkSelfPermission(
                        this,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE
                ) != PackageManager.PERMISSION_GRANTED ||
                        ContextCompat.checkSelfPermission(
                                this,
                                android.Manifest.permission.READ_EXTERNAL_STORAGE
                        ) != PackageManager.PERMISSION_GRANTED
        ) {
            // If not granted requesting Read and  Write storage
            ActivityCompat.requestPermissions(this, /*You can ask for multiple request by adding
            more permissions to the string*/new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.READ_EXTERNAL_STORAGE}, 60);
        } else {
            // If permissions are granted we proceed by setting an OnClickListener for the button
            // which helps the user pick the image
            setView();
        }
    }

    // This method is called after the permissions have been asked i.e. the dialog that says
    // allow or deny
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // Now by default we assume that the permission has not been granted
        boolean allPermissionsGranted = false;
        // Now we check if the permission was granted
        if ( requestCode == 60 && grantResults.length > 0) {
            // If all the permissions are granted allPermissionsGranted is set to true else false
            allPermissionsGranted = grantResults[0] == PackageManager.PERMISSION_GRANTED
                    &&
                    grantResults[1] == PackageManager.PERMISSION_GRANTED;
        }
        // If permissions are granted we call the setView Method which prompts the user to pick
        // an Image either by the clicking it now or picking from the gallery
        if ( allPermissionsGranted ) {
            setView();
        }
    }
}

これらのコード ブロックは順番に並んでいます。つまり、これらのブロックをすべてマージすると、完全な MainActivity.java クラスが得られます。

このアプリを実装する場合は、ID「imageViewCameraImage」の ImageView と ID「buttonCaptureImageFromCamera」のボタンを含むレイアウト ファイルを作成する必要があります。

お役に立てれば。私はこれが長いことを知っており、これを書くことで長くしています。よろしく、ジョエル

于 2020-11-20T09:18:45.273 に答える