如何正确获得可​​用的相机

时间:2019-03-18 21:08:14

标签: flutter

因此,我一直在尝试几种不同的解决方案,但似乎没有一种有效。我正在尝试创建一个自拍功能,该功能也有一些覆盖。

我正在使用fluro转到我要在其中使用相机的地方创建的自拍屏幕。

我尝试了多种方法,例如setState(() {});和下面的方法。 但是我似乎没有任何相机。如果我尝试使用camera软件包随附的demp应用程序,它将运行正常。

我只是看不到如何在单独的组件文件中获取可用的相机。还有一种方法可以在应用初始化期间获取摄像头,并将摄像头从应用程序构造函数一直传递到我需要的组件。但这似乎是一种不好的做法。

有人能有更好的方法吗?

这是我的selfie_component.dart文件

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

class SelfiePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new SelfiePageState();
}

class SelfiePageState extends State<SelfiePage> {
  CameraController _camera;
  CameraLensDirection _direction = CameraLensDirection.back;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<CameraDescription> _getCamera(CameraLensDirection dir) async {
    return await availableCameras().then(
      (List<CameraDescription> cameras) => cameras.firstWhere(
            (CameraDescription camera) => camera.lensDirection == dir,
          ),
    );
  }

  void _initializeCamera() async {
    _camera = CameraController(
      await _getCamera(_direction),
      ResolutionPreset.medium,
    );
    print(_camera);
    await _camera.initialize();
  }

  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: _scaffoldKey,
      body: Column(
        children: <Widget>[
          Expanded(
            child: Container(
              child: Padding(
                padding: const EdgeInsets.all(1.0),
                child: Center(
                  child: _cameraPreviewWidget(),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }

  /// Display the preview from the camera (or a message if the preview is not available).
  Widget _cameraPreviewWidget() {
    if (_camera == null || !_camera.value.isInitialized) {
      return const Text(
        'Tap a camera',
        style: TextStyle(
          color: Colors.white,
          fontSize: 24.0,
          fontWeight: FontWeight.w900,
        ),
      );
    } else {
      return AspectRatio(
        aspectRatio: _camera.value.aspectRatio,
        child: CameraPreview(_camera),
      );
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我已经解决了问题。

我已经制作了一个单独的BYTE * someRoutineInsideService() { DWORD err; BYTE* pbEncryptedBlob = NULL; DWORD cbEncryptedBlob; BYTE* pbDecryptedMessage = NULL; DWORD cbDecryptedMessage; pbEncryptedBlob = malloc(BUF_SZ); cbEncryptedBlob = BUF_SZ; /**** read pbEncryptedBlob from file ****/ pbDecryptedMessage = malloc(BUF_SZ); cbDecryptedMessage = BUF_SZ; /**** code below ****/ err = myDecryptMessage("MY", pbEncryptedBlob, cbEncryptedBlob, pbDecryptedMessage, &cbDecryptedMessage); if (err != 0) goto cleanup; cleanup: if (pbEncryptedBlob) free(pbEncryptedBlob); return(pbDecryptedMessage); } DWORD myDecryptMessage(LPSTR cStore, BYTE *pbEncryptedBlob, DWORD cbEncryptedBlob, BYTE *pbDecryptedMessage, DWORD *cbDecryptedMessage) { HCERTSTORE CertStoreArray[1]; CRYPT_DECRYPT_MESSAGE_PARA DecryptParams; DWORD DecryptParamsSize = sizeof(DecryptParams); HCRYPTPROV hCryptProv = 0; // CSP handle HCERTSTORE hStoreHandle = 0; DWORD err = 0; BOOL rc; rc = CryptAcquireContext( &hCryptProv, // Address for handle to be returned. NULL, // Use the current user's logon name. NULL, // Use the default provider. PROV_RSA_FULL, // Need to both encrypt and sign. 0); // No flags needed. if (!rc) { err = GetLastError(); goto cleanup; } hStoreHandle = CertOpenSystemStore(hCryptProv, cStore); if (hStoreHandle == NULL) { err = GetLastError(); goto cleanup; } CertStoreArray[0] = hStoreHandle; memset(&DecryptParams, 0, DecryptParamsSize); DecryptParams.cbSize = DecryptParamsSize; DecryptParams.dwMsgAndCertEncodingType = (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING); DecryptParams.cCertStore = 1; DecryptParams.rghCertStore = CertStoreArray; rc = CryptDecryptMessage( &DecryptParams, pbEncryptedBlob, cbEncryptedBlob, pbDecryptedMessage, cbDecryptedMessage, NULL); if (!rc) { err = GetLastError(); /**** returns 0x8009200C (CRYPT_E_NO_DECRYPT_CERT) if service run under LSA ****/ goto cleanup; } cleanup: if(hCryptProv) rc = CryptReleaseContext(hCryptProv,0); return(err); } 文件

{{url.page ? url.page : url.path | decodeURIComponent}}

然后将其导入正确的屏幕上,并调用selfie_camara_widget.dart