视频打算无法在Android(Appcelerator)

时间:2016-04-13 08:02:59

标签: android video appcelerator appcelerator-titanium

视频录制在IOS上运行良好,Android无法捕获数据。

问题似乎是

var curActivity = Ti.Android.currentActivity;
curActivity.startActivityForResult(intent, function(e) { ....

有一些建议使用win.getActivity()代替,但我没有可以使用的变量。 $ .cameraWin 这个 不管用。 有什么建议吗?

INDEX.XML



<Alloy>
    <TabGroup>        
    <Tab id="websiteTab" title="Web">
            <Require backgroundColor="black" color="white" id="webTab" src="website" type="view"/>
        </Tab>
        <Tab id="cameraTab" title="Camera">
            <Require backgroundColor="black" color="white" id="cameraTab" src="camera" type="view"/>
        </Tab>
        <Tab backgroundColor="black" color="white" id="loginTab" title="Login">
            <Require backgroundColor="black" color="white" id="loginTab" src="login" type="view"/>
        </Tab>
        <Tab backgroundColor="black" color="white" id="registerTab" title="Map">
            <Require backgroundColor="black" color="white" id="registerTab" src="register" type="view"/>
        </Tab>
    </TabGroup>
</Alloy>
&#13;
&#13;
&#13;

camera.xml

&#13;
&#13;
<Alloy>
    <Window id="cameraWin">
        <Label id="Label_1" text="Gib Deinem Video einen Namen"/>
        <TextField id="TextField_1"/>
        <Button id="Button_1" onClick="doClick" title="Aufnehmen und hochladen"/>
        <ProgressBar id="ProgressBar_1"/>
        <Picker id="Picker_1" selectionIndicator="true" useSpinner="true">
            <PickerColumn id="PickerColumn_1" title="Kategorie">
                <Row title="Fußball"/>
                <Row title="Handball"/>
                <Row title="Schifahren"/>
                <Row title="Einkehren"/>
            </PickerColumn>
        </Picker>
        <Label id="Label_2" text="Veranstaltung/Kategorie"/>
    </Window>
</Alloy>
&#13;
&#13;
&#13;

camera.js

&#13;
&#13;
function doClick(e) {
  Ti.API.info(Titanium.Platform.osname);
  if (Titanium.Platform.osname == 'iphone') {
    //record for iphone
    $.ProgressBar_1.value = 0;
    $.ProgressBar_1.message = "Hochladen"
    Titanium.Media.showCamera({
      success: function(event) {
        var video = event.media;
        movieFile = Titanium.Filesystem.getFile(
          Titanium.Filesystem.applicationDataDirectory,
          'mymovie.mov');

        movieFile.write(video);
        videoFile = movieFile.nativePath;
        var xhr = Titanium.Network.createHTTPClient();
        xhr.onload = function(e) {
          Ti.UI.createAlertDialog({
            title: 'Success',
            message: 'status code ' + this.status
          }).show();
          Ti.API.info(this.responseText);
        };
        xhr.open('POST', 'XXXXXXXXXX');
        xhr.send({
          Filedata: event.media,
          /* event.media holds blob from gallery */
          title: $.TextField_1.value,
          catid: 17
        });
        // onsendstream called repeatedly, use the progress property to
        // update the progress bar
        xhr.onsendstream = function(e) {
          $.ProgressBar_1.value = e.progress * 100;
          $.ProgressBar_1.message = "Hochladen von Video";
          Ti.API.info('ONSENDSTREAM - PROGRESS: ' + e.progress * 100);

        };


      },
      cancel: function() {},
      error: function(error) {
        // create alert
        var a =
          Titanium.UI.createAlertDialog({
            title: 'Video'
          });

        // set message
        if (error.code == Titanium.Media.NO_VIDEO) {
          a.setMessage('Device does not have video recording 
                            capabilities ');
        } else {
          a.setMessage('Unexpected error: ' + error.code);
        }

        // show alert
        a.show();
      },
      mediaTypes: Titanium.Media.MEDIA_TYPE_VIDEO,
      videoMaximumDuration: 120000,
      videoQuality: Titanium.Media.QUALITY_MEDIUM
    });
  } else {

    var intent = Titanium.Android.createIntent({
      action: 'android.media.action.VIDEO_CAPTURE'
    });
    Ti.API.info('Intent created. ..');
    var curActivity = Ti.Android.currentActivity;
    curActivity.startActivityForResult(intent, function(e) {
      if (e.error) {
        Ti.UI.createNotification({
          duration: Ti.UI.NOTIFICATION_DURATION_LONG,
          message: 'Error: ' + e.error
        }).show();
      } else {
        Ti.API.info('Drinnen');
        Ti.Api.info(e.resultCode);
        if (e.resultCode === Titanium.Android.RESULT_OK) {
          Ti.API.info('Drinnen');
          videoFile = e.intent.data;
          var source = Ti.Filesystem.getFile(videoFile);
          var movieFile =
            Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'mymovie.3gp');
          Ti.API.info('Sichert');
          source.copy(movieFile.nativePath);
          Titanium.Media.saveToPhotoGallery(movieFile);
          var xhr = Titanium.Network.createHTTPClient();
          xhr.onload = function(e) {
            Ti.UI.createAlertDialog({
              title: 'Success',
              message: 'status code ' + this.status
            }).show();
            Ti.API.info(this.responseText);
          };
          var fileContent = movieFile.read();
          Ti.API.info('Video rauf');
          xhr.open('POST', 'XXXXXXXXXXX'
            Filedata: fileContent,
            /* event.media holds blob from gallery */

            title: $.TextField_1.value,
            catid: 17
          });
          // onsendstream called repeatedly, use the progress property to
          // update the progress bar
          xhr.onsendstream = function(e) {
            $.ProgressBar_1.value = e.progress * 100;
            $.ProgressBar_1.message = "Hochladen von Video";
            Ti.API.info('ONSENDSTREAM - PROGRESS: ' + e.progress * 100);

          };
        } else {
          Ti.UI.createNotification({
            duration: Ti.UI.NOTIFICATION_DURATION_LONG,
            message: 'Canceled/Error? Result code: ' +
              e.resultCode
          }).show();
        }
      }
    });

  }
};
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

替代方式:

我目前正致力于在普通SDK中将视频录制到Android: https://github.com/appcelerator/titanium_mobile/pull/7929

它已经可以使用了(三星Galaxy S6在我需要修复的时候有一个问题:你需要旋转手机以获得正确的预览尺寸)但需要更多的测试。通过这种方式,您可以使用后置/前置摄像头以与iOS相同的方式录制视频。

但它仍然需要一些时间才能进入GA版本。如果你需要它,你总是可以为自己编译自己的sdk(我可以提供linux版本)。

答案 1 :(得分:0)

I have a similar project, though mine is taking stills, not video, but for all intents and purposes they should behave the same.

In my code I have:

var win = $.camera_view;

This allows me later to start my activity with:

win.activity.startActivityForResult(...

Per your example you would probably set curActivity like this:

var curActivity = $.cameraWin.activity;

[EDIT]

If you still get no result you can try using .putExtraUri to specify the location to store the video:

var tempfile = Ti.Filesystem.getFile(Ti.Filesystem.externalStorageDirectory, "tempvideo.mpg");
intent.putExtraUri("output",tempfile.nativePath);

You would set this before calling startActivityForResult.