【问题标题】:Delay going back to Main Activity延迟返回主活动
【发布时间】:2019-01-08 05:34:12
【问题描述】:

在主活动中,我调用本机相机应用程序。那很好。但是,在单击快门后,相机将返回到 Main Activity。如果他们的照片拍得正确,那就太好了。看起来相机需要一些时间来保存图片,离开相机应用会导致图片被关闭。

不确定我需要做什么才能让相机有足够的时间保存图片!

   /** Check if this device has a camera */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}


public void openCamera(View view) {
    Log.i("Camera", "Inside openCamera");
    if ( checkCameraHardware(getApplicationContext())) {
        if ( Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_DENIED) {
                Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
                startActivity(intentCamera);
            } else {
                Log.i("Camera", "Camera not permitted");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0);
            }
        } else {
            Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
            startActivity(intentCamera);
        }
    }
}

【问题讨论】:

  • 嗨。要打开相机,请使用 startActivityForResult(),您将在 onActivityResult 中获得结果,并根据结果将图像保存在首选位置。
  • 您找到解决方案了吗?如果是,请分享。

标签: android android-activity


【解决方案1】:

在您的ActivityFragment 中试试这个。

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

并使用此覆盖方法获取图像...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        mImageView.setImageBitmap(imageBitmap);
    }
}

示例如下Link

有两种类型的意图:

Explicit intents 指定哪个application 将满足intent,通过提供目标应用程序的包名称或完全限定的组件类名称。您通常会使用explicit intent 在您自己的应用程序中启动组件,因为您知道要启动的活动或服务的类名。例如,您可能会在您的应用中启动一个新的activity 以响应用户操作,或者启动一个服务以在后台下载文件。

Implicit intents 不命名特定组件,而是声明要执行的一般操作,这允许来自另一个应用程序的组件处理它。例如,如果您想向用户显示地图上的位置,您可以使用隐式意图来请求另一个有能力的应用程序在地图上显示指定位置。 More Info

注意:- 图像捕获是Implicit intent。你必须使用startActivityforResult()。它将使用您的操作系统软件应用程序捕获图像并返回给您的应用程序。

【讨论】:

    【解决方案2】:

    我认为你应该使用这个api用于相机,它易于使用并且可以解决你的问题。
    https://github.com/kosalgeek/PhotoUtil

    1. 下载 PhotoUtil.jar
    2. 将其复制并粘贴到您的 Android 项目中的 App > libs > 右键单击​​ jar 文件并选择 Add as Library

    使用相机拍照

    1. 添加权限 要使用摄像头,首先需要在AndroidManifest.xml中添加权限:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        ...>
        <uses-feature android:name="android.hardware.camera2" android:required="true"/>
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        ...
    </manifest>
    
    1. 调度相机并将其保存到外部存储中

    发送相机并保存照片:

    CameraPhoto cameraPhoto = new CameraPhoto(getApplicationContext());
    Intent in = cameraPhoto.takePhotoIntent();
    startActivityForResult(in, CAMERA_REQUEST);
    

    获取照片路径

    String photoPath = cameraPhoto.getPhotoPath(); //call it in onActivityResult() method
    

    代码片段:

    //declare them as global variables
    CameraPhoto cameraPhoto;
    final int CAMERA_REQUEST = 1100;
    protected void onCreate(Bundle savedInstanceState) {
      ...
      //initialize it inside onCreate()
      cameraPhoto = new CameraPhoto(getApplicationContext());
      
      //call it to open the camera
      startActivityForResult(cameraPhoto.takePhotoIntent(), CAMERA_REQUEST);
      cameraPhoto.addToGallery();
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == RESULT_OK){
          if(requestCode == CAMERA_REQUEST){
              String photoPath = cameraPhoto.getPhotoPath();
             try {
                  Bitmap bitmap = ImageLoader.init().from(photoPath).requestSize(512, 512).getBitmap();
                  imageView.setImageBitmap(bitmap); //imageView is your ImageView
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              }
          }
        }//end if resultCode
    }
    

    【讨论】:

      【解决方案3】:

      您的活动中有任何AsyncTask 电话吗?

      当我遇到这个问题时,我的 Activity 中有其他项目正在异步运行,但我的 UI 依赖于这些项目。我用myAsyncTask.execute(params)而不是myAsyncTask.executeOnExecutor(THREAD_POOL_EXECUTOR, params)给他们打电话。一旦我将所有呼叫切换到另一种模式,这个延迟问题就消失了。

      基本上,您的设备可能正在主线程中运行其他优先于 AsyncTask 的 doInBackground 的东西,然后您的应用就会卡住。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        相关资源
        最近更新 更多