[PWA] Access the Camera in a PWA built with React

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PWA] Access the Camera in a PWA built with React相关的知识,希望对你有一定的参考价值。

It‘s possible to access some, but not all, of the native device features from a PWA. One that we canaccess, is the camera and camera roll. We‘ll use two different methods to allow users to upload images to our application.

First, we‘ll add a file input that accepts images. We can specify a capture param, which will tell PWAs on mobile devices to prompt the user to take a picture with their camera.

Next, we‘ll access the camera feed directly by rendering a video tag, and accessing navigator.mediaDevices.getUserMedia directly - which will allow us to show a live video feed from the camera. Then, we can use a canvas tag to grab a frame from that video, and render the image.

 

class Profile extends Component {

  state = {
    image: null,
    supportsCamera: ‘mediaDevices‘ in navigator
  }

  changeImage = (e) => {
    this.setState({
      image: URL.createObjectURL(e.target.files[0])
    })
  }

  startChangeImage = () => {
    this.setState({ enableCamera: !this.state.enableCamera })
  }

  takeImage = () => {
    this._canvas.width = this._video.videoWidth
    this._canvas.height = this._video.videoHeight

    this._canvas.getContext(‘2d‘).drawImage(
      this._video,
      0, 0,
      this._video.videoWidth,
      this._video.videoHeight
    )

    this._video.srcObject.getVideoTracks().forEach(track => {
      track.stop()
    })

    this.setState({
      image: this._canvas.toDataURL(),
      enableCamera: false
    })
  }

  render() {
    return (
      <div>
        <nav className="navbar navbar-light bg-light">
            <span className="navbar-brand mb-0 h1">
              <Link to="/">
                <img src={Back} alt="logo" style={{ height: 30 }} />
              </Link>
              Profile
            </span>
        </nav>

        <div style={{ textAlign: ‘center‘ }}>
          <img 
            src={this.state.image || GreyProfile} alt="profile" 
            style={{ height: 200, marginTop: 50 }} 
          />
          <p style={{ color: ‘#888‘, fontSize: 20 }}>username</p>

          {
            this.state.enableCamera &&
            <div>
              <video 
                ref={c => {
                  this._video = c
                  if(this._video) {
                    navigator.mediaDevices.getUserMedia({ video: true })
                      .then(stream => this._video.srcObject = stream)
                  }
                }}
                controls={false} autoPlay
                style={{ width: ‘100%‘, maxWidth: 300 }}
              ></video>

              <br />

              <button
                onClick={this.takeImage}
              >Take Image</button>

              <canvas 
                ref={c => this._canvas = c}
                style={{ display: ‘none‘ }}
              />

            </div>
          }

          <br />
          {
            this.state.supportsCamera &&
            <button
              onClick={this.startChangeImage}
            >
              Toggle Camera
            </button>
          }
        </div>

      </div>
    )
  }

}

 

Video, Code

以上是关于[PWA] Access the Camera in a PWA built with React的主要内容,如果未能解决你的问题,请参考以下文章

[PWA] 17. Cache the photo

[PWA] 18. Clean the photo cache

[PWA] Customize the Splash Screen of a PWA built with create-react-app

[PWA] 15. Using The IDB Cache And Display Entries

[PWA] Check Online Status by using the NavigatorOnLine API

ruby 来自http://stackoverflow.com/questions/3539148/how-do-i-access-the-name-of-the-rails-3-applicatio