我的相机应用程序不适用于 kitkat 但适用于其他手机

维卡什·夏尔马

一旦我在我的 kitkat 设备中捕获图像,代码就会直接进入 elseif 条件,它User cancelled image capture在其他 api 设备上正常工作时显示

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;

import java.io.File;
import java.util.List;

public class MainActivity extends AppCompatActivity {

// Activity request codes
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;

// key to store image path in savedInstance state
public static final String KEY_IMAGE_STORAGE_PATH = "image_path";

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

// Bitmap sampling size
public static final int BITMAP_SAMPLE_SIZE = 8;

// Gallery directory name to store the images or videos
public static final String GALLERY_DIRECTORY_NAME = "Hello Camera";

// Image and Video file extensions
public static final String IMAGE_EXTENSION = "jpg";
public static final String VIDEO_EXTENSION = "mp4";

private static String imageStoragePath;

private TextView txtDescription;
private ImageView imgPreview;
private VideoView videoPreview;
private Button btnCapturePicture, btnRecordVideo;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Checking availability of the camera
    if (!CameraUtils.isDeviceSupportCamera(getApplicationContext())) {
        Toast.makeText(getApplicationContext(),
                "Sorry! Your device doesn't support camera",
                Toast.LENGTH_LONG).show();
        // will close the app if the device doesn't have camera
        finish();
    }

    txtDescription = findViewById(R.id.txt_desc);
    imgPreview = findViewById(R.id.imgPreview);
    videoPreview = findViewById(R.id.videoPreview);
    btnCapturePicture = findViewById(R.id.btnCapturePicture);
    btnRecordVideo = findViewById(R.id.btnRecordVideo);

    /**
     * Capture image on button click
     */
    btnCapturePicture.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (CameraUtils.checkPermissions(getApplicationContext())) {
                captureImage();
            } else {
                requestCameraPermission(MEDIA_TYPE_IMAGE);
            }
        }
    });

    /**
     * Record video on button click
     */
    btnRecordVideo.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (CameraUtils.checkPermissions(getApplicationContext())) {
                captureVideo();
            } else {
                requestCameraPermission(MEDIA_TYPE_VIDEO);
            }
        }
    });

    // restoring storage image path from saved instance state
    // otherwise the path will be null on device rotation
    restoreFromBundle(savedInstanceState);
}

/**
 * Restoring store image path from saved instance state
 */
private void restoreFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        if (savedInstanceState.containsKey(KEY_IMAGE_STORAGE_PATH)) {
            imageStoragePath = savedInstanceState.getString(KEY_IMAGE_STORAGE_PATH);
            if (!TextUtils.isEmpty(imageStoragePath)) {
                if (imageStoragePath.substring(imageStoragePath.lastIndexOf(".")).equals("." + IMAGE_EXTENSION)) {
                    previewCapturedImage();
                } else if (imageStoragePath.substring(imageStoragePath.lastIndexOf(".")).equals("." + VIDEO_EXTENSION)) {
                    previewVideo();
                }
            }
        }
    }
}

/**
 * Requesting permissions using Dexter library
 */
private void requestCameraPermission(final int type) {
    Dexter.withActivity(this)
            .withPermissions(Manifest.permission.CAMERA,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.RECORD_AUDIO)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    if (report.areAllPermissionsGranted()) {

                        if (type == MEDIA_TYPE_IMAGE) {
                            // capture picture
                            captureImage();
                        } else {
                            captureVideo();
                        }

                    } else if (report.isAnyPermissionPermanentlyDenied()) {
                        showPermissionsAlert();
                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).check();
}


/**
 * Capturing Camera Image will launch camera app requested image capture
 */
private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    File file = CameraUtils.getOutputMediaFile(MEDIA_TYPE_IMAGE);
    if (file != null) {
        imageStoragePath = file.getAbsolutePath();
    }

    Uri fileUri = CameraUtils.getOutputMediaFileUri(getApplicationContext(), file);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

/**
 * Saving stored image path to saved instance state
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save file url in bundle as it will be null on screen orientation
    // changes
    outState.putString(KEY_IMAGE_STORAGE_PATH, imageStoragePath);
}

/**
 * Restoring image path from saved instance state
 */
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // get the file url
    imageStoragePath = savedInstanceState.getString(KEY_IMAGE_STORAGE_PATH);
}

/**
 * Launching camera app to record video
 */
private void captureVideo() {
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

    File file = CameraUtils.getOutputMediaFile(MEDIA_TYPE_VIDEO);
    if (file != null) {
        imageStoragePath = file.getAbsolutePath();
    }

    Uri fileUri = CameraUtils.getOutputMediaFileUri(getApplicationContext(), file);

    // set video quality
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file

    // start the video capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
}

/**
 * Activity result method will be called after closing the camera
 */
**@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // if the result is capturing Image
    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Refreshing the gallery
            CameraUtils.refreshGallery(getApplicationContext(), imageStoragePath);
            // successfully captured the image
            Toast.makeText(this, "Image saved to:\n" +
                    data.getExtras().get("data"), Toast.LENGTH_LONG).show();
            // display it in image view
            previewCapturedImage();
        } else if (resultCode == RESULT_CANCELED) {
            // user cancelled Image capture
            Toast.makeText(getApplicationContext(),
                    "User cancelled image capture", Toast.LENGTH_SHORT)
                    .show();
        } else {
            // failed to capture image
            Toast.makeText(getApplicationContext(),
                    "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                    .show();
        }
    } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Refreshing the gallery
            CameraUtils.refreshGallery(getApplicationContext(), imageStoragePath);
            // video successfully recorded
            // Video captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Video saved to:\n" +
                    data.getExtras().get("data"), Toast.LENGTH_LONG).show();
            // preview the recorded video
            previewVideo();
        } else if (resultCode == RESULT_CANCELED) {
            // user cancelled recording
            Toast.makeText(getApplicationContext(),
                    "User cancelled video recording", Toast.LENGTH_SHORT)
                    .show();
        } else {
            // failed to record video
            Toast.makeText(getApplicationContext(),
                    "Sorry! Failed to record video", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}**

/**
 * Display image from gallery
 */
private void previewCapturedImage() {
    try {
        // hide video preview
        txtDescription.setVisibility(View.GONE);
        videoPreview.setVisibility(View.GONE);

        imgPreview.setVisibility(View.VISIBLE);

        Bitmap bitmap = CameraUtils.optimizeBitmap(BITMAP_SAMPLE_SIZE, imageStoragePath);

        imgPreview.setImageBitmap(bitmap);

    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}

/**
 * Displaying video in VideoView
 */
private void previewVideo() {
    try {
        // hide image preview
        txtDescription.setVisibility(View.GONE);
        imgPreview.setVisibility(View.GONE);

        videoPreview.setVisibility(View.VISIBLE);
        videoPreview.setVideoPath(imageStoragePath);
        // start playing
        videoPreview.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Alert dialog to navigate to app settings
 * to enable necessary permissions
 */
private void showPermissionsAlert() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Permissions required!")
            .setMessage("Camera needs few permissions to work properly. Grant them in settings.")
            .setPositiveButton("GOTO SETTINGS", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    CameraUtils.openSettings(MainActivity.this);
                }
            })
            .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                }
            }).show();
}
}
沙扎德·阿弗里迪

onActivityResult 当您启动的活动退出时调用,为您提供启动它的 requestCode、它返回的 resultCode 以及来自它的任何其他数据。如果活动显式返回该结果、未返回任何结果或在其操作期间崩溃,则 resultCode 将为 RESULT_CANCELED。RESULT_CANCELED 值为 0,可能在 KitKat 上未设置结果值并返回默认值。

作为 KitKat 的解决方法,您可以尝试在 onActivityResult 触发时检查您的应用程序是否为默认应用程序。

安卓文档:点击这里

对于代码,请查看此链接:https : //stackoverflow.com/a/29876919/6672577

开始活动结果

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // start the image capture Intent
        startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

活动结果

if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {


            Toast.makeText(this, "Image saved to:\n" +
                    data.getExtras().get("data"), Toast.LENGTH_LONG).show();
            // display it in image view
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            previewCapturedImage(photo); // pass bitmap to the method so you can preview it.
        }

预览捕获的图像

private void previewCapturedImage(Bitmap bitmap) {
    try {
        // hide video preview
        txtDescription.setVisibility(View.GONE);
        videoPreview.setVisibility(View.GONE);

        imgPreview.setVisibility(View.VISIBLE);
        imgPreview.setImageBitmap(bitmap);

    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有Facebook登录名的Android应用程序不适用于除我的手机以外的其他手机

setOnEditorActionListener不适用于android kitkat

我在我的应用程序中使用Microsoft Translator Local sdk进行脱机文本到文本的翻译,但不适用于android kitkat

简单的stepCounter不适用于其他手机

android开关样式不适用于KitKat(4.4.2)

KitKat SMS限制和超越限制,适用于KitKat

TabPane 不适用于我的应用程序

滚动事件不适用于手机

Woocommerce 链接不适用于手机

该应用程序不适用于特定手机| 如何在清单中排除电视

我的应用程序不适用于 Marshmallow 但适用于 Nougat?

我的 recyclerView 适用于调试,但不适用于“运行应用程序”

Android - 声明应用程序仅适用于手机

Android应用程序仅适用于手机,如何?

QWidget vs Qt Quick适用于手机应用程序开发

媒体查询适用于手机,但不适用于平板电脑

媒体查询不适用于手机,但响应性适用于桌面

Play商店应用详情链接不适用于手机

Google Play IAB突然不适用于我的手机

Asp.Net Core 应用程序不适用于其他领域

适用于Android手机的指纹API

适用于 Azure 的 Android 手机 MFA

输入类型日期仅适用于手机

适用于美国的Ubuntu手机

找不到XF绑定..属性,仅适用于我的Android应用程序,而不适用于iOS

ApI AI 应用程序在网络模拟器上运行良好,但不适用于 Android 手机

适用于手机的Microsoft Dynamics CRM“未授权使用此应用程序”-IOS

应用程序图标不适用于 Snap 打包

POST 方法不适用于 Flask 应用程序