Фонарик для Windows Phone 7

.NET*

Предисловие


Купил себе виндофон и решил попробовать написать что-нибудь под него, тем более, что с .NET знаком по роду деятельности. Идею подсказал товарищ с android-приложением фонарик, источником света которого являлась LED вспышка.


Первое решение


Почитал msdn, все показалось просто. Создаем объект Microsoft.Devices.PhotoCamera; смотрим, поддерживает ли наше устройство фото-вспышку; если поддерживает, то переключаем PhotoCamera.FlashMode, по нажатию кнопки. Как сказал бы Ливанов: «Элементарно, Ватсон!». Но не тут-то было.

Первый момент, который меня озадачил — инициализация камеры. Просто создать объект Microsoft.Devices.PhotoCamera не достаточно. Для этих целей, в уже знакомой статье на msdn, используется установка созданного объекта камеры в качестве источника для VideoBrush. Это излишняя нагрузка, как мне кажется, но других способов я не нашел (может кто-то из читающих подскажет). К слову сказать, плотно и не искал, ибо мною двигала другая цель.

А вот второй момент поставил в тупик описываемый вариант решение. В результате, по нажатию кнопки, мы видим, что дисплей подсвечивается, а LED-вспышка работать не желает. Чтож, печалька.


Второе решение


Начинаем копать дальше… С удивлением узнаю у гугла, что ребята из Microsoft скрыли от непросвещенных некоторые сборки (вот негодяи).

Нашел умельца на codeproject, который хакнул камеру WP7 с помощью скрытых от посторонних глаз возможностей. Но не столь интересен сам пост, сколько ссылки, которые он предоставляет в общее пользование. Идея состоит в том, что бы, как описано в Tom's blog, сделать необходимые сборки доступными и воспользоваться для подсветки, как советует Clarity Consulting Blog, Microsoft.Devices.VideoCamera.


Реализация


Итак, информации более чем достаточно, приступим к делу. В Tom's blog говориться, что легче всего достать необходимые сборки из «Emulator BIN» или скачать его собственный дамп. Что такое «Emulator BIN» я не понял и долго заморачиваться не стал, воспользовался его наработкой. Берем из архива GAC_Microsoft.Phone.Media.Extended_v7_0_0_0_cneutral_1.dll и, чтобы нам легче было добавлять ссылки в следующий раз на эту сборку, копируем в папку "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71" (нужны права администратора) с именем Microsoft.Phone.Media.Extended.dll. Естественно, у кого ОС стоит на другом разделе или не 64-разрядная, будут небольшие вариации.
Затем открываем папку с именем RedistList (она лежит в той же директории, что и скопированный только что файл), а в ней файл FrameworkList.xml. Его нужно отредактировать (я это делал в фаре, ибо папка со специфическими правами доступа). Копируем произвольный узел File, например для AssemblyName=«Microsoft.Phone.Interop», удаляем во вновь скопированном узле PublicKeyToken и меняем AssemblyName на Microsoft.Phone.Media.Extended.
Теперь нужно открыть visual studio command prompt и выполнить команду sn -Vr Microsoft.Phone.Media.Extended.dll, иначе у нас при построении проекта с этой сборкой будут ошибки.


Теперь самое приятное — создание приложения. Достаточно создать обычный Silverlight проект для WP7 и добавить сборку Microsoft.Phone.Media.Extended. В нем будет довольно простенькая разметка, единственное, что здесь достойно внимания, так это контрол CameraVisualizer, он отображает захваченное с камеры изображение (но мы-то помним, что он нам нужен только для инициализации объекта камеры). И чтобы нас не отвлекала картинка на дисплее установим этому элементу полную непрозрачность.
Вот разметка


<phone:PhoneApplicationPage 
    x:Class="PhoneApp1.MainPage"
    ...
    xmlns:media="clr-namespace:Microsoft.Phone;assembly=Microsoft.Phone.Media.Extended"
    ...
    shell:SystemTray.IsVisible="False">
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <media:CameraVisualizer x:Name="_cameraVisualizer" Opacity="0" />
        <Button x:Name="_btnFlash" Click="ButtonClick" IsEnabled="false">
            <Button.Content>
                <Image VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="300" Source="Power_On_Off.png"/>
            </Button.Content>
        </Button>
    </Grid>
</phone:PhoneApplicationPage>


Так же интересным фактором является то, что в коде необходимо указать на необходимость использовать LED вспышку _videoCamera.LampEnabled = true; и то, что фонарик начинает работать только во время записи с камеры. Точнее говоря, самой записи не будет, то есть поток данных не будет занимать физического пространства.


using System.Windows;
using Microsoft.Phone;

namespace PhoneApp1
{
    public partial class MainPage
    {
        private VideoCamera _videoCamera;

        public MainPage()
        {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            InitializeCamera();
        }

        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            _videoCamera.Dispose();
            _videoCamera = null;
        }

        private void InitializeCamera()
        {
            _videoCamera = new VideoCamera(); //  Создание объекта камеры
            _videoCamera.Initialized += VideoCameraInitialized;
            _cameraVisualizer.SetSource(_videoCamera);// Инициализация объекта камеры
        }

        void VideoCameraInitialized(object sender, System.EventArgs e)
        {
            _videoCamera.Initialized -= VideoCameraInitialized;
            _videoCamera.LampEnabled = true; // Да будет свет!!!
            Dispatcher.BeginInvoke(() => { _btnFlash.IsEnabled = true; });
        }

        private void ButtonClick(object sender, RoutedEventArgs e)
        {
            // Когда идет запись, фонарик работает. При прекращении записи, он отключается.
            if (_videoCamera.IsRecording)
                _videoCamera.StopRecording();
            else
                _videoCamera.StartRecording();
        }
    }
}


PS: Конструктивная критика в адрес первого топика и моего стиля изложения приветствуется.

Используемые источники


1 msdn
2 codeproject
3 Tom's blog
4 Clarity Consulting Blog
5 xda-developers


UPD Дамы и господа, я прекрасно понимаю, что статья кому-то понравилась, кому-то нет. Но в личку пишут только те, кто положительно отнеслись к посту в целом, но имеют замечания по тем или иным моментам. Убедительная просьба — если минусуете, оставляйте отзыв что не понравилось. Для меня важно на первом этапе понять, что я делаю не так.
+50
4 декабря 2011, 19:38
26
DjoNIK 3,5

комментарии (26)

0
hotach #
Интересно, а можно как-нибудь програмно определить тип выспышки(ксеоновая/светоидная) не храня базу всех моделей?
0
DjoNIK #
Вопрос интересный. Когда искал материал для решении задачи, ничего подобного не видел. То есть никакие свойства либо методы, возвращающие эту информацию, обнаружены не был.
Но если я я не увидел суслика, это не значит, что его нет.
0
mtp #
Кстати говоря, аппаратный вопрос: как повлияет постоянная работа вспышки на температурный режим внутри девайса? Там диод ничего не расплавит? Охлаждения-то толком и нет, а на постоянную работу вспышки инженеры никак не рассчитывали.
0
raptor #
-> Что такое «Emulator BIN» я не понял

Ну думается мне это файл с эмулятором Windows Phone.
+2
z130 #
Это файл двоичного образа (BIN = binary) микропрограммы, запускаемой в эмуляторе, обычно называют прошивкой.
Теоретически эмулятор может стартовать даже на прошивке от реального устройства, на практике этому мешают проблемы с драйверами.
0
raptor #
Да спасибо, я знаю что это за файл.
+1
z130 #
Да я так только, простыми словами ))))
+2
Useless_guy #
>>Теоретически эмулятор может стартовать даже на прошивке от реального устройства, на практике этому мешают проблемы с драйверами.
У эмулятора архитектура x86
0
VenomBlood #
Зря минусуете человека, эмулятор WP7 действительно собран под x86, и запустить этот бинарник на ARM процессоре не выйдет.
0
z130 #
Логично, иначе бы оно тормозило, как у андроида.
0
Nagg #
так этих фонариков там уже как минимум 3 в маркете вроде
+6
DjoNIK #
Так то чужие фонарики ))
Да если бы все было только по msdn не писал бы пост. А тут с загогуленкой.
0
Nagg #
Статья хорошая и полезная, я скорее про идею
0
z130 #
Это вы еще в interop не лазили, там отдельная долгая и унылая песня начинается, для которой хорошо бы знать C++ вместо C# ))
0
Nagg #
А смысл? мс не пустит такое приложение в маркетплейс
0
hotach #
Можно ожидать, что появится альтернативный marketplace для «рутованных» телефонов.
0
z130 #
Смысл в разного рода твикерах, т.к. у MS все что можно зашито в реестр.
Маркетплейс пока кажется не соорудили, но уже есть много desktop приложений, позволяющих бесплатно качать с маркета, потом приложение переподписывается и свободно используется на разлоченном устройстве.
0
AlexS #
уже появился, mktwp7.codeplex.com/
Еще один был на XDA, не помню название, светло-синий скин у него.
0
z130 #
Интересно, библиотеки из прошивки реального устройства как-то можно выдрать?
0
DjoNIK #
Думается мне, что нет. Все нижеизложенное лишь рассуждения, могу и ошибаться.
На устройстве WP7 хранилище данных зашифровано. Да и синхронизировать можно только через Zune (который привязан к LiveID). Поэтому выдрать из виндофона что-то без LiveID и пароля (пара по которой генерируется ключ считывания зашифрованных данных) невозможно.
0
z130 #
Хранилище данных зашифровано, здесь нет вопросов, а вот прошивка скорее всего только подписана, иначе это отражается на скорости работы исполняемого кода.
Да и не стал бы никто советовать выдирать файлы из прошивки эмулятора, если бы она была зашифрована.
В общем, откуда-то файлы эти выдирают.
Саму прошивку можно с устройства слить вроде как, есть системные утилиты типа WP Support Tool v2.
0
Useless_guy #
>>Саму прошивку можно с устройства слить вроде как, есть системные утилиты типа WP Support Tool v2.
Нет, во всяком случае через эту программу точно. 100% вариант только джтаг.
+15
mtp #
1. Берём фонарик
2. Приматываем его к телефону синей изолентой
3.…
4. Профит!

+16
DjoNIK #
Главное, чтоб изолента была аккуратными квадратиками в Metro-стиле ))
+1
Alexzero #
Изолента должна быть синей. Иначе будет лагать и телефон, и фонарь.
0
mtp #
При всём уважении, синяя изолента — это грязный советский хак дефолтно зелёненького MS-интерфейса.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.