Найдите все средства управления в Окне WPF типом

Соотношение между размером видео и пропускной способностью сетевой загрузки в заданном интервале времени является низким для одновременной загрузки / записи видеопотока, если только у пользователя нет очень быстрого сотового соединения LTE.

Однако, когда запись будет завершена, вы можете загрузить файл на свой сервер по протоколу FTP. Рекомендуется дать каждому записанному файлу Universal Unique Identifier (UUID), чтобы иметь возможность различать все другие записанные файлы. Я использовал этот код (не проверен для Android, но отлично работает на JavaSE 7). Поскольку это довольно долгий (но быстрый) процесс, я сделал вам резюме. (Хорошо, да?)

Резюме

1) Сгенерируйте UUID с UUID.randomUUID().toString();, который будет использоваться в течение всего процесса для идентификации записанного файла.
2) Запишите файл с именем "sdcard/" + uuid + ".3gp"
3) Когда запись закончится, загрузите файл на сервер через FTP-загрузку.
4) Прикажите вашему удаленному серверу выполнить скрипт PHP, который будет делать с записанным файлом все, что ему нужно, например, манипулирование базой данных и т. Д. (Если такой скрипт есть, если вам это не нужно, просто пропустите это шаг).
5) Закажите удаленный сервер, чтобы удалить файл, если это необходимо. (выполняется с помощью другого сценария PHP)

Код

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

public class FTPUploader {
    static void doUpload(String uuid) {

      File fileSource = new File("/sdcard/" + uuid + ".3gp");
      // Or new File("/sdcard/recording.3gp");

      String fileName = fileSource.getName();

      /** YOUR SERVER'S INFORMATIONS **/
      String userName = "USERNAME";
      String password = "PASSWORD";
      String ftpServer = "FTP.SERVER.COM";
      /****/

      StringBuffer sb = new StringBuffer("ftp://");

      sb.append(userName);
      sb.append(':');
      sb.append(password);
      sb.append('@');

      sb.append(ftpServer);
      sb.append("/"); 
            /**WARNING: Path extension; it will be added after connection
            *The file must be at your server's root. Otherwise the PHP script won't detect it.
            **/
      sb.append(fileName);

      sb.append(";type=i");


      BufferedInputStream bis = null;
      BufferedOutputStream bos = null;
      try {

            URL url = new URL(sb.toString());
            URLConnection urlc = url.openConnection();
            bos = new BufferedOutputStream(urlc.getOutputStream());
            bis = new BufferedInputStream(new FileInputStream(fileSource));

            int i;

            // read byte by byte until end of stream
            while ((i = bis.read()) != -1) {
                  bos.write(i);
            }
      } catch (Exception e) {
            e.printStackTrace();
      } finally {

            if (bis != null)
                  try {
                        bis.close();
                  } catch (IOException ioe) {
                        ioe.printStackTrace();
                        System.out.println("IO exception after if bis " + ioe);
                  }
            if (bos != null)
                  try {
                        bos.close();
                  } catch (IOException ioe) {
                        ioe.printStackTrace();
                        System.out.println("IO exception after if " + ioe);
                  }
      }
}
}  



import java.util.UUID;

public class Main {


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


        String uuid = UUID.randomUUID().toString();
        //Assuming you set your file's name as uuid + ".3gp"
        FTPUploader.doUpload(uuid);            
        //Launches a FTP Upload


        //Then, if you want to ask your server to "process" the file you gave him, you can perform a simple HTTP request:

        try {
    String url = "http://YOURSITE.COM/shell.php";
    String charset = "iso-8859-1";
    String param1 = uuid;
    String query = String.format("id=%s", URLEncoder.encode(param1, charset));

        URLConnection connection = new URL(url + "?" + query).openConnection();
        connection.setRequestProperty("Accept-Charset", charset);
        connection.getInputStream();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
        //This try {}catch{} requests a PHP script: this script is "triggered" just like if it was loaded in your web browser, with as parameter the file UUID (`shell.php?id=UUID`), so that he knows wich file on his server he has to process.

}  

БОНУС : если вы хотите удалить файл с вашего сервера, когда закончите с ним, вы можете выполнить ту же строку, что и раньше, но заменив «shell.php» другим PHP-скриптом, который вы можете вызвать «delete.php». Он будет содержать следующие строки:

 Соотношение между размером видео и пропускной способностью сетевой загрузки в заданном интервале времени является низким для одновременной загрузки / записи видеопотока, если только у пользователя нет очень быстрого сотового соединения LTE. 

Однако, когда запись будет завершена, вы можете загрузить файл на свой сервер по протоколу FTP. Рекомендуется дать каждому записанному файлу Universal Unique Identifier (UUID), чтобы иметь возможность различать все другие записанные файлы. Я использовал этот код (не проверен для Android, но отлично работает на JavaSE 7). Поскольку это довольно долгий (но быстрый) процесс, я сделал вам резюме. (Хорошо, да?)

Резюме

1) Сгенерируйте UUID с UUID.randomUUID().toString();, который будет использоваться в течение всего процесса для идентификации записанного файла.
2) Запишите файл с именем "sdcard/" + uuid + ".3gp"
3) Когда запись закончится, загрузите файл на сервер через FTP-загрузку.
4) Прикажите вашему удаленному серверу выполнить скрипт PHP, который будет делать с записанным файлом все, что ему нужно, например, манипулирование базой данных и т. Д. (Если такой скрипт есть, если вам это не нужно, просто пропустите это шаг).
5) Закажите удаленный сервер, чтобы удалить файл, если это необходимо. (выполняется с помощью другого сценария PHP)

Код

[110]

БОНУС : если вы хотите удалить файл с вашего сервера, когда закончите с ним, вы можете выполнить ту же строку, что и раньше, но заменив «shell.php» другим PHP-скриптом, который вы можете вызвать «delete.php». Он будет содержать следующие строки:

[111]

Например: следующий запрос http://www.YOURSERVER.com/delete.php?id=123456789 удаляет http://www.YOURSERVER.com/123456789.3gp на вашем сервере.

Другой пример кода

Несколько недель назад я установил приложение Java (я назвал его Atom ...), которое анализирует голос и отвечает на все вопросы (используя Google (неофициальный) Voice API распознавания и Wolfram | Alpha API). Вы обязательно должны взглянуть на это на GitHub , там есть все используемые файлы, как на стороне рабочего стола, так и на на стороне сервера . Надеюсь, я помог!

РЕДАКТИРОВАТЬ: Для работы с сервером Helix

я нашел этот учебник о Как управлять и использовать FTP на simplehelix.com и это видео Windows Server 2008 R2 - Настройка FTP-сервера . Вам нужно только следовать инструкциям, но пропустить шаг, называемый Вход в учетную запись FTP , потому что он только объясняет, как управлять файлами из клиента приложения (например, FileZilla или CuteFTP). Этот сделан из фрагмента Java, который я написал выше. Кроме того, если это может вам помочь, я нашел это видео .

ПРИМЕЧАНИЕ: В первом коде (Java), если корневой каталог, к которому обращается ваш FTP-сервер, не является папкой, содержащей все медиа-файлы, вам придется заменить sb.append("/"); по пути к папке, в которой / должны быть расположены потоковые медиафайлы. Пример формы, sb.append("/username/media/");.

GET['id'] . ".3gp"; unlink($recordedFile); ?>

Например: следующий запрос http://www.YOURSERVER.com/delete.php?id=123456789 удаляет http://www.YOURSERVER.com/123456789.3gp на вашем сервере.

Другой пример кода

Несколько недель назад я установил приложение Java (я назвал его Atom ...), которое анализирует голос и отвечает на все вопросы (используя Google (неофициальный) Voice API распознавания и Wolfram | Alpha API). Вы обязательно должны взглянуть на это на GitHub , там есть все используемые файлы, как на стороне рабочего стола, так и на на стороне сервера . Надеюсь, я помог!

РЕДАКТИРОВАТЬ: Для работы с сервером Helix

я нашел этот учебник о Как управлять и использовать FTP на simplehelix.com и это видео Windows Server 2008 R2 - Настройка FTP-сервера . Вам нужно только следовать инструкциям, но пропустить шаг, называемый Вход в учетную запись FTP , потому что он только объясняет, как управлять файлами из клиента приложения (например, FileZilla или CuteFTP). Этот сделан из фрагмента Java, который я написал выше. Кроме того, если это может вам помочь, я нашел это видео .

ПРИМЕЧАНИЕ: В первом коде (Java), если корневой каталог, к которому обращается ваш FTP-сервер, не является папкой, содержащей все медиа-файлы, вам придется заменить sb.append("/"); по пути к папке, в которой / должны быть расположены потоковые медиафайлы. Пример формы, sb.append("/username/media/");.

213
задан akjoshi 24 December 2012 в 00:31
поделиться

6 ответов

Это должно помочь

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

, затем вы перечислите элементы управления следующим образом

foreach (TextBlock tb in FindVisualChildren<TextBlock>(window))
{
    // do something with tb here
}
417
ответ дан 23 November 2019 в 04:27
поделиться

Используйте вспомогательные классы VisualTreeHelper или LogicalTreeHelper в зависимости от того, какое дерево вас интересует. Они оба предоставляют методы для получение потомков элемента (хотя синтаксис немного отличается). Я часто использую эти классы для поиска первого вхождения определенного типа, но вы можете легко изменить его, чтобы найти все объекты этого типа:

public static DependencyObject FindInVisualTreeDown(DependencyObject obj, Type type)
{
    if (obj != null)
    {
        if (obj.GetType() == type)
        {
            return obj;
        }

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject childReturn = FindInVisualTreeDown(VisualTreeHelper.GetChild(obj, i), type);
            if (childReturn != null)
            {
                return childReturn;
            }
        }
    }

    return null;
}
13
ответ дан 23 November 2019 в 04:27
поделиться

Это самый простой способ:

63
ответ дан 23 November 2019 в 04:27
поделиться

И вот как это работает вверх

    private T FindParent<T>(DependencyObject item, Type StopAt) where T : class
    {
        if (item is T)
        {
            return item as T;
        }
        else
        {
            DependencyObject _parent = VisualTreeHelper.GetParent(item);
            if (_parent == null)
            {
                return default(T);
            }
            else
            {
                Type _type = _parent.GetType();
                if (StopAt != null)
                {
                    if ((_type.IsSubclassOf(StopAt) == true) || (_type == StopAt))
                    {
                        return null;
                    }
                }

                if ((_type.IsSubclassOf(typeof(T)) == true) || (_type == typeof(T)))
                {
                    return _parent as T;
                }
                else
                {
                    return FindParent<T>(_parent, StopAt);
                }
            }
        }
    }
2
ответ дан 23 November 2019 в 04:27
поделиться

Обратите внимание, что использование VisualTreeHelper работает только с элементами управления, производными от Visual или Visual3D. Если вам также необходимо проверить другие элементы (например, TextBlock, FlowDocument и т. Д.), Использование VisualTreeHelper вызовет исключение.

Вот альтернатива, которая при необходимости возвращается к логическому дереву:

http: //www.hardcodet .net / 2009/06 / find-elements-in-wpf-tree-two-way

2
ответ дан 23 November 2019 в 04:27
поделиться

Чтобы получить список всех дочерних элементов определенного типа, вы можете использовать:

private static IEnumerable<DependencyObject> FindInVisualTreeDown(DependencyObject obj, Type type)
{
    if (obj != null)
    {
        if (obj.GetType() == type)
        {
            yield return obj;
        }

        for (var i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            foreach (var child in FindInVisualTreeDown(VisualTreeHelper.GetChild(obj, i), type))
            {
                if (child != null)
                {
                    yield return child;
                }
            }
        }
    }

    yield break;
}
4
ответ дан 23 November 2019 в 04:27
поделиться
Другие вопросы по тегам:

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