ошибка при захвате камеры и ввода звука

с использованием некоторых изящных новых API-интерфейсов в iOS4 я пытаюсь захватить ввод с камеры и микрофона iPhone и сохранить его в файл. ниже приведен код, который я использую.

AVCaptureSession* captureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error];
AVCaptureDeviceInput* videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:captDevice error:&error];
AVCaptureMovieFileOutput * videoOutput = [[AVCaptureMovieFileOutput alloc] init];

if (videoInput && videoOutput && audioInput) 
{
    [captureSession addInput:audioInput];
    [captureSession addInput:videoInput];
    [captureSession addOutput:videoOutput];
    if([captDevice lockForConfiguration:&error])
    {
        if ([captDevice hasTorch]) 
            captDevice.torchMode = AVCaptureTorchModeOn;

        [captDevice unlockForConfiguration];
    }
    else 
    {
        NSLog(@"Could not lock device for config error: %@", error);
    }

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSURL* saveLocationURL = [[NSURL alloc] initFileURLWithPath:[NSString stringWithFormat:@"%@/movie.mov", documentsDirectory]];

    [videoOutput startRecordingToOutputFileURL:saveLocationURL recordingDelegate:self];
    [captureSession startRunning];

    [saveLocationURL release];
}
else 
{
    NSLog(@"Video Error: %@", error);
}   

когда didFinishRecordingToOutputFileAtURL возвращается, я получаю загадочный ответ об ошибке.

Error Domain=AVFoundationErrorDomain Code=-11803 "Cannot Record" UserInfo=0x152f70 {NSLocalizedRecoverySuggestion=Try recording again., AVErrorRecordingSuccessfullyFinishedKey=false, NSLocalizedDescription=Cannot Record}

код ошибки -11803 означает " и единственный ответ, который я могу найти, кажется: « не помещайте ListView в ScrollView ». Мне еще предстоит увидеть какое-либо реальное объяснение , почему, хотя . Кажется, единственная причина, по которой я могу найти это, заключается в том, что Google не считает, что вам следует этого делать. Ну, я делаю, так и сделал.

Итак, вопрос в том, как поместить ListView в ScrollView, не сворачивая его до минимальной высоты?

347
задан Celeo 16 April 2015 в 09:42
поделиться

3 ответа

Использование ListView для того, чтобы сделать его не прокручиваемым, чрезвычайно дорого и противоречит всей цели ListView. Вы должны НЕ делать этого. Вместо этого используйте LinearLayout.

195
ответ дан 23 November 2019 в 00:28
поделиться

Вот мое решение. Я новичок в платформе Android, и я уверен, что это немного взломано, особенно в части прямого вызова .measure и непосредственной установки свойства LayoutParams.height , но это работает.

Все, что вам нужно сделать, это вызвать Utility.setListViewHeightBasedOnChildren (yourListView) , и он будет изменен, чтобы точно соответствовать высоте его элементов.

public class Utility {
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();

        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            if (listItem instanceof ViewGroup) {
                listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
             }

             listItem.measure(0, 0);
             totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }
}
260
ответ дан 23 November 2019 в 00:28
поделиться

Вы не должны помещать ListView в ScrollView, потому что ListView уже является ScrollView. Это все равно, что поместить ScrollView в ScrollView.

Чего вы пытаетесь достичь?

3
ответ дан 23 November 2019 в 00:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: