Страницы

Поиск по вопросам

Показаны сообщения с ярлыком xamarin. Показать все сообщения
Показаны сообщения с ярлыком xamarin. Показать все сообщения

воскресенье, 8 марта 2020 г.

Могут ли сосуществовать VMWare и Hyper-V?

#xamarin #vmware #hyper_v


Доброго времени суток, дамы и господа, совсем недавно решил попробовать Xamarin.IOS
и Xamarin.Android, само - собой для компиляции приложений для IOS я скачал образ MacOs
для VMWare,отключил HYPER-V, все установил и запустил, потратив еще немного времени
смог уже скомпилировать первое тестовое приложение на MacOS, решил попробовать запустить
тестовое приложение на Android, но при попытке запуска эмулятора Visual Studio сообщила
об ошибке о невозможности запуска эмулятора из-за отключенного Hyper-V, и мне вдруг
стало любопытно, возможно ли как -то использовать VMWare вместе с включенным Hyper-V,
чтобы не перезагружать компьютер и не отключать виртуальную машину ?
Всем заранее спасибо за ваши ответы!
    


Ответы

Ответ 1



Гипервизоры дерутся за аппаратную виртуализацию Hyper-V она необходима. И будучи установленным, он будет удерживать права на неё у себя, не давая их никому. Его можно выключить, не удаляя (опцией в загрузчике hypervisorlaunchtype в off с помощью bcdedit) но подействует это только после перезагрузки. VMWare Workstation отказался при установленном Hyper-V даже запускать главное окно, не говоря уже о виртуалках. Вероятно, ему аппаратная виртуализация тоже необходима. VirtualBox без аппаратной виртуализации... функционирует. Но очень плохо, в основном медленно, хотя некоторые жалуются и на падения. Так что нет, похоже, что эффективно два разных гипервизора на одной машине работать не могут.

среда, 22 января 2020 г.

Xamarin и ошибки компиляции

#c_sharp #visual_studio #visual_studio_2015 #xamarin


Я пользуюсь Xamarin for VS2015. Летом я установил Xamarin на личный компьютер. Там
до сих пор всё работает, там можно создавать приложения. Другое дело - рабочий компьютер.
Туда я установил Xamarin в октябре. И пошло-поехало... Начнём с того, что как только
я компилирую программу на каком либо устройстве, VS ждет, что-то делает, и говорит,
мол, что при сборке возникли ошибки. А окно ошибок ничего не показывает. 

Я думал, что проблема в эмуляторе( я бедное существо у которого нет смартфона). Поэтому
использовал прилагающийся эмулятор от Google. Не работало. Просто не запускалось, хотя
писало "Готово". После использования Nox Emulator, понял что просто код не так компилируется.
APK файл появился - но не работает.

И да... Всё это шаблон, начальный код. То есть после создания проекта я ничего не
менял. Не работает!

Что надо сделать, чтобы исправить проблему?
    


Ответы

Ответ 1



Бывают разные случаи. Когда такое возникает. Чаще всего. Достаточно удалить bin и obj в проекте. И проблема уходит. Проверяйте настройки проекта. Такие у меня настройки. Может стоять лишняя галочка предназначенная только для Release. Проверьте Advanced properties / Support architectures (для эмуляторов должны стоять галочки x86_64 и/или x86 В путях к sdk и ndk не должно быть русских символов Обновите sdk, ndk до последних версий. Если выше перечисленное не помогло. И Вы используете шаблонное приложение. Попробуйте переустановить sdk, ndk или обновить плагин для Visual Studio. Иногда помогает и это. Но это редкий случай. Не использовать эмуляторы Apache Cordova. Только от google либо Microsoft. Примерные действия. Которые мне помогают решать такую проблему. Которая периодически возвращается.

Ответ 2



На самом деле, ответ на вопрос нашёл самостоятельно, когда читал документацию к эмулятору... Заметим, что в каждом неудачном случае, я использовал слабые компьютеры. Поэтому, собственно говоря и возникла ошибка с эмулятором. Решение проблемы: купить смартфон и не мучаться.

Ответ 3



Не каждый смартфон будет работать,у меня на одном компе нормально эмуляцию делает,на другом просто беда,можно пробовать использовать разные эмуляторы,например есть эмулятор bluestack, у эмулятора от студии то-ли на 10,то-ли на 8ке бывают баги связанные с inteL HAXM к примеру.

воскресенье, 12 января 2020 г.

Как сделать автокоррекцию изображения(Яркость\Контрастность) для изображения Android Opencv/ColorMatrixFilter

#android #opencv #xamarin #фильтры


Я использую OpenCV для андроида.
Хотелось бы узнать,как можно сделать автокоррекцию изображения (контраст\яркость)
посредством библиотеки OpenCV или же это можно сделать нативном образом?(через ColorMatrixFilter
от Android'a).  

Пытался нагуглить,но так и не нашел вменяего туториала\примера по данной теме.
Как можно это сделать?
Благодарю! 
    


Ответы

Ответ 1



Несмотря на то, что алгоритмов восстановления неравномерно освещённых изображений разработано множество, OpenCV на сегодняшний день не предоставляет чего-то такого готового из коробки. Тем не менее в сети имеется множество примеров реализации и как раз с использованием OpenCV. Чаще всего встречаются алгоритмы на основе Retinex (немного связанной теории на русской вики: Цветопостоянство), но хотелось бы выделить сайт, если не ошибаюсь, хорватских разработчиков - "Image Processing Group". На нём в свободном доступе представлены не только исходники (С++ / OpenCV, лицензия GNU GPL), но даже и инструмент, позволяющий воочию оценить результаты работы алгоритмов непосредственно в браузере.

четверг, 9 января 2020 г.

Как определить на какую кнопку нажал пользователь

#android #c_sharp #button #xamarin #click


Итак, есть 5 кнопок на экране, нужно определить на какую кнопку нажал пользователь
и взять её тег после чего редирект на другое активити. Пытался сделать это так:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    SetTheme(Android.Resource.Style.ThemeDeviceDefaultLightNoActionBar);
    SetContentView(Resource.Layout.MainScreen);

    Button BtnHm = (Button)FindViewById(Resource.Id.Home);
    BtnHm.Click += SwitchActivity;

    Button BtnSrch = (Button)FindViewById(Resource.Id.Search);
    BtnSrch.Click += SwitchActivity;

    Button BtnLstOfPh = (Button)FindViewById(Resource.Id.ListOfPhotos);
    BtnLstOfPh.Click += SwitchActivity;

    Button BtnGlr = (Button)FindViewById(Resource.Id.Glory);
    BtnGlr.Click += SwitchActivity;

    Button BtnMyAcc = (Button)FindViewById(Resource.Id.MyAcc);
    BtnMyAcc.Click += SwitchActivity;
}

public void SwitchActivity(object sender, EventArgs e)
{
    Button sendBtn = (Button)sender;

    switch (sendBtn.Tag)
    {
        case 1:
            Intent toMain = new Intent(this, typeof(MainScreenActivity));
            StartActivity(toMain);
            break;
        case 2:
            Intent toSearch = new Intent(this, typeof(SearchActivity));
            StartActivity(toSearch);
            break;
        case 3:
            Intent toPhoto = new Intent(this, typeof(ListOfPhotoActivity));
            StartActivity(toPhoto);
            break;
        case 4:
            Intent toGlory = new Intent(this, typeof(GloryActivity));
            StartActivity(toGlory);
            break;
        case 5:
            Intent toUser = new Intent(this, typeof(UserActivity));
            StartActivity(toUser);
            break;
    }
}


Но мне подчеркивает в case цифры и пишет что требуется постоянное значение. Как исправить?


    


Ответы

Ответ 1



Чтобы вы ни писали в xml, в свойство Tag любое значение будет паковаться (Tag - всё же object). При запросе свойства вы будете всегда получать object, поэтому нужно провести распаковку: switch ((int) sendBtn.Tag)

Ответ 2



Тебе нужно присвоить каждой кнопке Id и в конструкции switch() искать view-элемент по id пример: switch(sendBtn.getId()){ case R.id.btn1: ... case R.id.btn2: ...} Если это не подходит для Вашего языка программирования, я надеюсь, что мой ответ подскажет вам путь решения данной проблемы. Всего хорошего)

Ответ 3



XAML `

пятница, 27 декабря 2019 г.

Xamarin Forms - пара вопросов про лицензию

#c_sharp #лицензирование #xamarin



У производителя Xamarin Forms нет представительства в России, поэтому накладную подписать
некому, а по другому у нас в фирме не делается. Есть ли возможность все же как-то легально
приобрести Xamarin Forms нашей фирмой? (за исключением оплаты своей частной картой)
В новой бесплатной версии Visual Studio 2015 Community включен Xamarin. Но не понятно,
обозначает ли это, что использование этой технологии стало бесплатным? (звучит маловероятным)

    


Ответы

Ответ 1



В Visual Studio 2015 Community включен Xamarin Starter Edition. Starter Edition is our free tier, which allows anyone to get a taste of mobile development in C# by writing small app* which can be deployed to devices and published to app stores. По сноске есть определение small app: Apps must meet size restrictions(128k of compiled C# or F# code), include only managed code (not Objective-C/Swift, Java, or C/C++ libraries), and use Xamarin.iOS/Xamarin.Android, not Xamarin.Forms. UPD: http://www.syssoft.ru/Xamarin/ - официальный партнер-реселлер в России. Работают с юрлицами. Принимают оплату по безналу.

Xamarin график с AChartEngine

#android #c_sharp #xamarin #chart #график


Хочу нарисовать график, нашел бесплатную библиотеку AChartEngine. Однако демо который
там имеется реализован на java. Пытался импортировать этот проект в Android Studio,
но ругается на отсутствие gradle в проекте.

В примере встречается создание объектов интерфейса(что нельзя сделать в c#) и не
получается разобраться как происходит отрисовка самого графика. Понимаю, что рисуется
это в LinearLayout, но как это делается... 

Написал Main.axml по этому примеру

Main.axml



    
    
        
        
        
        
        


Ответы

Ответ 1



Давно пользовался этой библиотекой, насколько помню, следующий шаг должен быть: var view = new GraphicalView(context, lineChart) Т.е. создать view на базе графика и как обычно вставить его в разметку. Добавлено А это не этот же компонент, уже адаптированный под Xamarin? https://components.xamarin.com/view/achartengine

вторник, 24 декабря 2019 г.

Показать метку на всех устройствах

#c_sharp #google_maps #xamarin


Работаю с Google-картой, используя Xamarin. Мне нужно, чтобы метку (маркер), которую
я поставил в своем приложении, увидели все устройства. 

К примеру: я создал новую метку на карте и эта же метка отобразилась на другом устройстве. 

Пока в голове крутится такая мысль: при создании метки посылать на сторонний сервер
координаты метки (который в свою очередь сохраняет ее) и в приложении делать все время
запросы и при появлении новой метки ее показывать на карте.

Правильно ли я думаю? Может есть другие более легкие способы? Решил сначала спросить,
прежде чем начать реализовывать.
    


Ответы

Ответ 1



Да, синхронизация через сервер - правильное решение. Для такой простой задачи (отображение у клиентов общей простой инфы с сервера) можно даже взять готовое решение типа Firebase. Вот даже какая-то либа под Xamarin есть: Firebase.Xamarin Общая идея такова: Клиент подписывается на получение всех элементов из выборки в БД. При изменении БД у клиента будет вызван метод, в который придёт изменённая инфа При добавлении клиентом инфы в удалённую БД она появится у всех остальных подписанных клиентов. По факту вам надо лишь составить модель данных, отправить её и получать её же. Все методы для этого в либе есть и кода нужно минимум. А серверного кода не нужно вообще. Стоит учесть, что в РФ в данный момент не очень ясно как будет FireBase работать, ибо гугл делал НЕмассовую расылку юзерам о прекращении работы с физ.лицами из-за нежелания возиться с НДС. Но вот лично у меня пока что всё работает и писем таких не было. В любом случае есть аналогичные сервисы, в т.ч. отечественные Кажется, прямо сегодня Realm запилил аналог FireBase, который можно поднять на своём сервере. В итоге получается та же штука что и с Firebase, только на своём сервере и через привычный Realm. https://realm.io/docs/get-started/installation/linux/

воскресенье, 22 декабря 2019 г.

Работа в фоновом режиме (Xamarin)

#c_sharp #net #xamarin #mobile_development


Подскажите как можно решить данный кейс для iOS 9+, Android 4.4+ и WP 8.1+.

Программа раз в день должна проверять счёт пользователя и если он меньше 30 руб.
то уведомлять.

Как реализовать уведомления на трех платформах я разобрался.

А вот заставить программу работать постоянно (как сервис в Windows) не ясно и получиться
ли это реализовать кроссплатформенно?

P.S. Пишу свое первое приложение для мобилок. 
    


Ответы

Ответ 1



То, что Вы хотите, называется Push Notification-ом. То, что Вы указали в примере - это локальное уведомление, по сути, c таймером на исполнение. Указали тайтл, текст, время, и вуаля, заданный текст показался в нужное время. В Вашем случае, такой вариант не подойдет просто потому, что счёт пользователя, как я понял - некое хранилище средств, лежащее извне, и для его проверки, понадобится исполнение кода приложения, а значит, приложение должно быть запущено. В случае с Пушем все проще, так как тут даже не нужна работа приложения, Вам нужен сервер который скажет, что нужно отправить уведомление. Если я ошибаюсь, и его счёт сугубо виртуальная валюта, которая пополняется со временем - рассчитать время заполнения или растраты - не трудно, достаточно знать его потребление на момент изменения. Что касается первого варианта, если счета пользователя - некое подобие кошельков на Вашем сервере, то Вам понадобится только промежуточный сервис отправки подобных уведомлений, к примеру: FCM (Android), APNS (iOS), WNS (Windows). Ваш сервер через подобный сервис будет сам уведомлять пользователя о малом количестве средств. Можете прочесть более подробно тут: Основы успешной реализации push-уведомлений для мобильных приложений

Ответ 2



https://xamdev.ru/background-task-xamarin/ Пишите отдельный код для каждой платформы, затем используете технологию отсюда https://metanit.com/sharp/xamarin/12.3.php чтобы объединить все вместе

суббота, 21 декабря 2019 г.

Почему async/await блокирует UI? [дубликат]

#c_sharp #xamarin #async_await


        
             
                
                    
                        
                            This question already has an answer here:
                            
                        
                    
                
                        
                            Зависает оператор `await` в оконном приложении / программа
висит при вызове Task.Result или Wait
                                
                                    (1 ответ)
                                
                        
                                Закрыт 1 год назад.
            
                    
Пытаюсь разобраться с async/await.

Вызываю асинхронный метод:

public static async Task GetData(string url)
{
    dynamic results = await DataService.getData(url);
}


Cам метод:

public static async Task getData(string url)
{
    HttpClient client = new HttpClient();
    var response = await client.GetAsync(url);
    while(true){} // специально сделанное зацикливание, чтобы увидеть что UI не блокируется
    dynamic data = null;
    if(response !=null)
    {
        string json = response.Content.ReadAsStringAsync().Result;
        data = JsonConvert.DeserializeObject(json);
    }
    return data;
}


Однако при вызове этого метода всё зависает. Почему все зависает, ведь на сколько
я понимаю, async\await должен создаваться в отдельном потоке и следовательно не должен
блочить UI, а просто зацикливаться в "фоновом" потоке?
    


Ответы

Ответ 1



Нет, вы понимаете неправильно. Если async-функция запущена в UI-потоке, она в нём и выполняется (это можно легко увидеть, залогировав Id потока), за исключением await’ов, во время которых функция вообще нигде не выполняется (и тем самым освобождает UI-поток). Иначе как бы можно было получать доступ к UI-контролам в async-функции? Уберите вечный цикл, он завешивает UI. Что потенциально может вывести async-функцию в другой поток — это ConfigureAwait(false), но в вашей функции его нет. У вас ошибка в строке string json = response.Content.ReadAsStringAsync().Result; Вы не должны синхронно дожидаться завершения Task’а ReadAsStringAsync(). Замените это на string json = await response.Content.ReadAsStringAsync(); Кстати, у вас есть ещё одна потенциально медленная операция в UI-потоке: JsonConvert.DeserializeObject(json). Вынесите её в фоновый поток при помощи data = await Task.Run(() => JsonConvert.DeserializeObject(json)); По поводу механики (как именно работает async-функция на нижнем уровне) можно почитать, например, тут, тут, тут, тут, тут и тут. И посмотреть тут.

воскресенье, 8 декабря 2019 г.

Imgproc.FindContours не заполняет List<MatOfPoint> контуров Opencv Android

#android #opencv #xamarin #monodroid


Использую OpenCV4Android версии 2.4.11 (разработка ведется под Xamarin.Android).
Я пытаюсь найти Границы прямоугольного объекта(лист бумаги формата А4) посредством
OpenCV. 
Пытаюсь реализовать следующий алгоритм:
Canny edge -> Largest contour -> largest rectangle -> find corners -> perspective change.

Вот мой код:

using(Bitmap _img = BitmapFactory.DecodeFile(App._file.Path)) {
    if (_img != null) {
        m = new Mat();
        grayM = new Mat();

        Utils.BitmapToMat(_img, m);
        //apply filter
        Imgproc.Canny(m, m, 100, 100, 3, true);
        //gaus Blur
        Imgproc.GaussianBlur(m, m, new Org.Opencv.Core.Size(5, 5), 5);
        //list for contours
        List < MatOfPoint > Contours = new List < MatOfPoint > ();
        Mat hierarcy = new Mat();
        //our method to find contours,via filling List(Contours)
        Imgproc.FindContours(m, Contours, hierarcy, Imgproc.RetrList, Imgproc.ChainApproxSimple);

        System.Console.WriteLine(Contours.Count + " Contours founded");
        //Dont know why,but Contours list is always empty(no values)
        if (Contours.Count != 0) {
            MatOfPoint temp = Contours[0];
        }
    }


И тут я застрял, потому что не понимаю, почему FindContours не заполняет значениями
мой список List(всегда пустой).
Перепробовал наверное все,все равно не хочет.
В чем же может быть проблема?   

Так же,довольно странная проблема:
Исходное изображение #1

если я использую только такие методы, как Imgproc.Canny и Imgproc.GaussianBlur ,
то тогда результат выглядит примерно так(контуры обведены отлично):
  

В противном случае,а именно когда я использую метод Imgproc.FindContours,то результат
выглядит гораздо хуже,ежели без использования самого метода(нахождения контуров),к
тому же List он не заполняет,т.е. лист остается пустым,после инициализации:


Другое исходное изображение #2:

без использования метода Imgproc.FindContours(только Imgproc.Canny вместе с Imgproc.GaussianBlur) :

а здесь уже применяется FindContours метод :


Все же не могу понять,где моя ошибка. Может кто то подсказать\объяснить что я делаю
не так,а так же как мне достичь моей цели?
Заранее благодарю!

PPS позже выложу результаты альтернативных алгоритмов(к примеру,через HoughLinesP
или FeatureDetector.Fast)
    


Ответы

Ответ 1



После того как было потрачено куча времени,я пришел к выводу,что это просто напросто Баг, т.к. скорей всего не корректно спортировался этот метод(а что именно не так встало,не понятно). Решением проблемы может быть: Установка новой версии(к примеру OpenCV 3.0.0). Заимплементить Java Wrapper класс,который можно будет подключить к проекту и успешно юзать(через мир Java'ы). Такие вот дела. PS в нативной форме все работает как часы.

воскресенье, 1 декабря 2019 г.

Запретить выход из приложения (Kiosk Mode)

#java #android #c_sharp #xamarin


Необходимо запустить приложение для андройда в режиме "Kiosk Mode". Необходимо, чтобы
пользователь не мог закрыть или свернуть приложение, а также войти в настройки устройства.

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

Для достижения поставленной задачи я уже сделал следующее (используется Xamarin):


Запустил приложение как лаунчер и развернул приложение на весь экран:

[Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon",
    Theme = "@android:style/Theme.Light.NoTitleBar.Fullscreen")]
[IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { 
    Intent.CategoryHome, Intent.CategoryDefault })]

Сделал пустым обработчик события кнопки назад:

public override void OnBackPressed(){}



Сейчас пользователь может использовать панель уведомлений и кнопку домой и кнопку
назад. Доступ к кнопкам домой и назад не страшен, так как кнопка домой возвращает пользователя
к приложению, и из меню задач лаунчер (это приложение) закрыть нельзя.

Необходимо заблокировать панель уведомлений или сделать так, чтобы ее использовать
было практически невозможно (чтобы пользователь не смог зайти в настройки, выключить
Wi-fi и так далее). Есть рут права. 

Использовать изоленту, бесцветный лак, ломать тачскрин и другие аппаратные способы
блокирования доступа к панели уведомлений использовать нельзя.

Дополнение 1

Использование следующего кода приводит к полному отключению экрана до перезагрузки.
Возможно, если команда для отключения только строки состояния?

Java.Lang.Process proc = Java.Lang.Runtime.GetRuntime().Exec(
    new String[] { "su", "-c", "service call activity 42 s16 com.android.systemui" });
proc.Wait();


Дополнение 2

При использовании программ full!screen и Hide System Bar(Full Screen) программа не
отображается. Отображается только картинка рабочего стола и больше ничего до перезагрузки.
Планшет Prestigo multipad weze 3341 3g (PMT 3341_3G), android 5.1.1
    


Ответы

Ответ 1



Похоже, что вам нужeн Single-Purpose Devices. Официальная документация Set up Single-Purpose Devices Ещё есть статья на русском с разными хаками по ограничениям взаимодействия пользователя с устройством Kiosk Mode приложения на Android На Xamarin можно использовать любые нативные API, насколько мне известно. Так что думаю с этим проблем возникнуть не должно.

Ответ 2



Kiosk mode - это не фул-скрин, а полная блокировка bottom и status bar. Тогда пользователь действительно не сможет ничего сделать, помимо использования функционала программы (если конечно программа не выбросит ошибку). Мне приходилось делать такую программу, но использовалось средствами Android Studio, а не Xamarin. Делать это можно как через функцию: private void hideBar(){ try { Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 42 s16 com.android.systemui"}); proc.waitFor(); } catch(Exception ex) { Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); Log.e("ROOT ERROR", ex.getMessage()); } } Или через shell: adb shell su pm disable com.android.systemui //(enable) чтобы включить обратно Возможно следующие команды помогут добиться желаемого результата и с помощью Xamarin. Из личного опыта советую создать плавающие системные кнопки управления (как минимум "назад") которая появляется при выходе из приложения. На случай, когда приложение вылетает или надо что-то поменять в настройках Вам не придется включать .systemui обратно.

Ответ 3



@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return false; } Может быть так?

Ответ 4



К сожалению некогда читать все ваши комментарии, но из того что прочел решил что у вас осталась проблема только лишь в том, чтобы заблокировать выпадающую панель. Попробуйте добавить строку: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); setContentView(R.layout.activity_main); Ну а дальше читайте официальную документацию

Ответ 5



Чтобы заблокировать открытие статусбара (подобно мастеру настройки (SetupWizard)) вам необходимо с помощью рефлексии вызвать метод disable в классе android.os.StatusBarManager. Если нужна поддержка всех андроидов то придется полазить по исходникам, так как могут быть разные версии метода. Вроде как, говорят, что это будет генерировать SecurityException с требованием выставить разрешения на статусбар в манифесте. И это конечно же ничего не изменит, в логах при установке будет написано, что данное разрешение доступно только для системных приложений. Если есть рут права - это ничего не меняет. Впринципе, можно переносить приложение в system/app но помимо этого приложение должно быть подписано системным сертификатом, который почти никак не узнать. Но есть один выход: прошить устройства на CyanogenMod (Lineage) - там сис.ключ открытый, но я не нашел никакой информации на эту тему. Как вариант Можно поставить на устройства Xposed Framework + модуль BusyBox, 100% в нем есть функция блокировки статусбара (или вообще, скрытия) или какой-то другой модуль, или напишите свой, Xposed Framework есть на гитхабе. Еще? Возможно, дурно, но все же. При запуске приложения переименовать system/app/SystemUI.apk (или переместить (или поменять пермишны)) и обновлять граф.интерфейс, а при закрытии (+ включении устройства (вдруг сядет)) восстанавливать.. + Не знаю, можно ли. Сделайте фуллскрин-приложение и в onTouchEvent в случае если action = MOVE (юзер смещает палец) закрывайте статусбар (метод collapsePanels (вроде) - это можно сделать без каких-либо ограничений. P.S Во всяком случае в UС Browser при просмотре видео если открыть статусбар то видео ставится на паузу, значит можно ставить слушатель на выдвигание (там фуллскрин, свайп для показа полосы шторки останавливает видео). ++ Можете вместо использования рефлексии поюзать шелл (закрыть статусбар) input swipe 0 100 0 0 Тоесть делаем свайп по Y от 100 сверху к нулю. Можно наверное это делать в каком то цикле (?) Идеи кончились

Ответ 6



Убил строку состояния приложением Custom Quick Settings и командами под рутом: settings put secure user_setup_complete 0 settings put global device_provisioned 0

вторник, 16 июля 2019 г.

Геолокация, сервис, уведомления

Добрый день. Пытаюсь сделать своё первое системное приложение под Андроид, связанное с геолокацией и локальными уведомлениями. Я себе представляю это так: есть основное активити MainActivity, при старте оно запускает сервис, который при смене координат отсылает их на сервер, а в ответ получает какое-то сообщение, которое выводится как локальное уведомление.
Собственно, есть некоторые проблемы.
Если закрыть само приложение (через диспетчер задач), то сервис приостанавливает свою работу - при смене координат ничего не происходит. Что нужно сделать, чтобы сервис работал всё время? Или это принципиально невозможно? При активации локального уведомления запускается активити NotifyActivity с подробной информацией. Там нажимаю buttonDelete, активити закрывается и происходит переход в MainActivity. Но если после этого переключиться на экран ОС (используя кнопку Back) и обратно, то вместо MainActivity опять отображается это самое NotifyActivity. Почему это происходит, как избежать?
MainActivity
[Activity(Label = "LocationTest", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main);
var button = FindViewById

среда, 13 марта 2019 г.

Xamarin и ошибки компиляции

Я пользуюсь Xamarin for VS2015. Летом я установил Xamarin на личный компьютер. Там до сих пор всё работает, там можно создавать приложения. Другое дело - рабочий компьютер. Туда я установил Xamarin в октябре. И пошло-поехало... Начнём с того, что как только я компилирую программу на каком либо устройстве, VS ждет, что-то делает, и говорит, мол, что при сборке возникли ошибки. А окно ошибок ничего не показывает.
Я думал, что проблема в эмуляторе( я бедное существо у которого нет смартфона). Поэтому использовал прилагающийся эмулятор от Google. Не работало. Просто не запускалось, хотя писало "Готово". После использования Nox Emulator, понял что просто код не так компилируется. APK файл появился - но не работает.
И да... Всё это шаблон, начальный код. То есть после создания проекта я ничего не менял. Не работает!
Что надо сделать, чтобы исправить проблему?


Ответ

Бывают разные случаи. Когда такое возникает.
Чаще всего. Достаточно удалить bin и obj в проекте. И проблема уходит. Проверяйте настройки проекта. Такие у меня настройки. Может стоять лишняя галочка предназначенная только для Release.


Проверьте Advanced properties / Support architectures (для эмуляторов должны стоять галочки x86_64 и/или x86
В путях к sdk и ndk не должно быть русских символов Обновите sdk, ndk до последних версий. Если выше перечисленное не помогло. И Вы используете шаблонное приложение. Попробуйте переустановить sdk, ndk или обновить плагин для Visual Studio. Иногда помогает и это. Но это редкий случай.
Не использовать эмуляторы Apache Cordova. Только от google либо Microsoft.
Примерные действия. Которые мне помогают решать такую проблему. Которая периодически возвращается.

понедельник, 18 февраля 2019 г.

Как определить на какую кнопку нажал пользователь

Итак, есть 5 кнопок на экране, нужно определить на какую кнопку нажал пользователь и взять её тег после чего редирект на другое активити. Пытался сделать это так:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState);
SetTheme(Android.Resource.Style.ThemeDeviceDefaultLightNoActionBar); SetContentView(Resource.Layout.MainScreen);
Button BtnHm = (Button)FindViewById(Resource.Id.Home); BtnHm.Click += SwitchActivity;
Button BtnSrch = (Button)FindViewById(Resource.Id.Search); BtnSrch.Click += SwitchActivity;
Button BtnLstOfPh = (Button)FindViewById(Resource.Id.ListOfPhotos); BtnLstOfPh.Click += SwitchActivity;
Button BtnGlr = (Button)FindViewById(Resource.Id.Glory); BtnGlr.Click += SwitchActivity;
Button BtnMyAcc = (Button)FindViewById(Resource.Id.MyAcc); BtnMyAcc.Click += SwitchActivity; }
public void SwitchActivity(object sender, EventArgs e) { Button sendBtn = (Button)sender;
switch (sendBtn.Tag) { case 1: Intent toMain = new Intent(this, typeof(MainScreenActivity)); StartActivity(toMain); break; case 2: Intent toSearch = new Intent(this, typeof(SearchActivity)); StartActivity(toSearch); break; case 3: Intent toPhoto = new Intent(this, typeof(ListOfPhotoActivity)); StartActivity(toPhoto); break; case 4: Intent toGlory = new Intent(this, typeof(GloryActivity)); StartActivity(toGlory); break; case 5: Intent toUser = new Intent(this, typeof(UserActivity)); StartActivity(toUser); break; } }
Но мне подчеркивает в case цифры и пишет что требуется постоянное значение. Как исправить?


Ответ

Чтобы вы ни писали в xml, в свойство Tag любое значение будет паковаться (Tag - всё же object). При запросе свойства вы будете всегда получать object, поэтому нужно провести распаковку:
switch ((int) sendBtn.Tag)

вторник, 12 февраля 2019 г.

Работа в фоновом режиме (Xamarin)

Подскажите как можно решить данный кейс для iOS 9+, Android 4.4+ и WP 8.1+
Программа раз в день должна проверять счёт пользователя и если он меньше 30 руб. то уведомлять.
Как реализовать уведомления на трех платформах я разобрался
А вот заставить программу работать постоянно (как сервис в Windows) не ясно и получиться ли это реализовать кроссплатформенно?
P.S. Пишу свое первое приложение для мобилок.


Ответ

То, что Вы хотите, называется Push Notification-ом. То, что Вы указали в примере - это локальное уведомление, по сути, c таймером на исполнение. Указали тайтл, текст, время, и вуаля, заданный текст показался в нужное время. В Вашем случае, такой вариант не подойдет просто потому, что счёт пользователя, как я понял - некое хранилище средств, лежащее извне, и для его проверки, понадобится исполнение кода приложения, а значит, приложение должно быть запущено. В случае с Пушем все проще, так как тут даже не нужна работа приложения, Вам нужен сервер который скажет, что нужно отправить уведомление.
Если я ошибаюсь, и его счёт сугубо виртуальная валюта, которая пополняется со временем - рассчитать время заполнения или растраты - не трудно, достаточно знать его потребление на момент изменения. Что касается первого варианта, если счета пользователя - некое подобие кошельков на Вашем сервере, то Вам понадобится только промежуточный сервис отправки подобных уведомлений, к примеру: FCM (Android), APNS (iOS), WNS (Windows). Ваш сервер через подобный сервис будет сам уведомлять пользователя о малом количестве средств.
Можете прочесть более подробно тут: Основы успешной реализации push-уведомлений для мобильных приложений

среда, 5 декабря 2018 г.

Xamarin Forms - пара вопросов про лицензию

У производителя Xamarin Forms нет представительства в России, поэтому накладную подписать некому, а по другому у нас в фирме не делается. Есть ли возможность все же как-то легально приобрести Xamarin Forms нашей фирмой? (за исключением оплаты своей частной картой) В новой бесплатной версии Visual Studio 2015 Community включен Xamarin. Но не понятно, обозначает ли это, что использование этой технологии стало бесплатным? (звучит маловероятным)


Ответ

В Visual Studio 2015 Community включен Xamarin Starter Edition
Starter Edition is our free tier, which allows anyone to get a taste of mobile development in C# by writing small app* which can be deployed to devices and published to app stores.
По сноске есть определение small app:
Apps must meet size restrictions(128k of compiled C# or F# code), include only managed code (not Objective-C/Swift, Java, or C/C++ libraries), and use Xamarin.iOS/Xamarin.Android, not Xamarin.Forms
UPD: http://www.syssoft.ru/Xamarin/ - официальный партнер-реселлер в России. Работают с юрлицами. Принимают оплату по безналу.

вторник, 27 ноября 2018 г.

Показать метку на всех устройствах

Работаю с Google-картой, используя Xamarin. Мне нужно, чтобы метку (маркер), которую я поставил в своем приложении, увидели все устройства.
К примеру: я создал новую метку на карте и эта же метка отобразилась на другом устройстве.
Пока в голове крутится такая мысль: при создании метки посылать на сторонний сервер координаты метки (который в свою очередь сохраняет ее) и в приложении делать все время запросы и при появлении новой метки ее показывать на карте.
Правильно ли я думаю? Может есть другие более легкие способы? Решил сначала спросить, прежде чем начать реализовывать.


Ответ

Да, синхронизация через сервер - правильное решение. Для такой простой задачи (отображение у клиентов общей простой инфы с сервера) можно даже взять готовое решение типа Firebase. Вот даже какая-то либа под Xamarin есть:
Firebase.Xamarin
Общая идея такова:
Клиент подписывается на получение всех элементов из выборки в БД. При изменении БД у клиента будет вызван метод, в который придёт изменённая инфа При добавлении клиентом инфы в удалённую БД она появится у всех остальных подписанных клиентов.
По факту вам надо лишь составить модель данных, отправить её и получать её же. Все методы для этого в либе есть и кода нужно минимум. А серверного кода не нужно вообще.

Стоит учесть, что в РФ в данный момент не очень ясно как будет FireBase работать, ибо гугл делал НЕмассовую расылку юзерам о прекращении работы с физ.лицами из-за нежелания возиться с НДС. Но вот лично у меня пока что всё работает и писем таких не было. В любом случае есть аналогичные сервисы, в т.ч. отечественные

Кажется, прямо сегодня Realm запилил аналог FireBase, который можно поднять на своём сервере. В итоге получается та же штука что и с Firebase, только на своём сервере и через привычный Realm.
https://realm.io/docs/get-started/installation/linux/

пятница, 12 октября 2018 г.

Imgproc.FindContours не заполняет List контуров Opencv Android

Использую OpenCV4Android версии 2.4.11 (разработка ведется под Xamarin.Android). Я пытаюсь найти Границы прямоугольного объекта(лист бумаги формата А4) посредством OpenCV. Пытаюсь реализовать следующий алгоритм: Canny edge -> Largest contour -> largest rectangle -> find corners -> perspective change.
Вот мой код:
using(Bitmap _img = BitmapFactory.DecodeFile(App._file.Path)) { if (_img != null) { m = new Mat(); grayM = new Mat();
Utils.BitmapToMat(_img, m); //apply filter Imgproc.Canny(m, m, 100, 100, 3, true); //gaus Blur Imgproc.GaussianBlur(m, m, new Org.Opencv.Core.Size(5, 5), 5); //list for contours List < MatOfPoint > Contours = new List < MatOfPoint > (); Mat hierarcy = new Mat(); //our method to find contours,via filling List(Contours) Imgproc.FindContours(m, Contours, hierarcy, Imgproc.RetrList, Imgproc.ChainApproxSimple);
System.Console.WriteLine(Contours.Count + " Contours founded"); //Dont know why,but Contours list is always empty(no values) if (Contours.Count != 0) { MatOfPoint temp = Contours[0]; } }
И тут я застрял, потому что не понимаю, почему FindContours не заполняет значениями мой список List(всегда пустой). Перепробовал наверное все,все равно не хочет. В чем же может быть проблема?
Так же,довольно странная проблема: Исходное изображение #1 если я использую только такие методы, как Imgproc.Canny и Imgproc.GaussianBlur , то тогда результат выглядит примерно так(контуры обведены отлично):
В противном случае,а именно когда я использую метод Imgproc.FindContours,то результат выглядит гораздо хуже,ежели без использования самого метода(нахождения контуров),к тому же List он не заполняет,т.е. лист остается пустым,после инициализации:
Другое исходное изображение #2: без использования метода Imgproc.FindContours(только Imgproc.Canny вместе с Imgproc.GaussianBlur) : а здесь уже применяется FindContours метод :
Все же не могу понять,где моя ошибка. Может кто то подсказать\объяснить что я делаю не так,а так же как мне достичь моей цели? Заранее благодарю!
PPS позже выложу результаты альтернативных алгоритмов(к примеру,через HoughLinesP или FeatureDetector.Fast)


Ответ

После того как было потрачено куча времени,я пришел к выводу,что это просто напросто Баг, т.к. скорей всего не корректно спортировался этот метод(а что именно не так встало,не понятно). Решением проблемы может быть:
Установка новой версии(к примеру OpenCV 3.0.0). Заимплементить Java Wrapper класс,который можно будет подключить к проекту и успешно юзать(через мир Java'ы).
Такие вот дела.
PS в нативной форме все работает как часы.

вторник, 9 октября 2018 г.

Запретить выход из приложения (Kiosk Mode)

Необходимо запустить приложение для андройда в режиме "Kiosk Mode". Необходимо, чтобы пользователь не мог закрыть или свернуть приложение, а также войти в настройки устройства.
Стоит задача сделать приложение для отзывов. Работать оно будет на планшете, доступном клиентам.
Для достижения поставленной задачи я уже сделал следующее (используется Xamarin):
Запустил приложение как лаунчер и развернул приложение на весь экран:
[Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon", Theme = "@android:style/Theme.Light.NoTitleBar.Fullscreen")] [IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { Intent.CategoryHome, Intent.CategoryDefault })] Сделал пустым обработчик события кнопки назад:
public override void OnBackPressed(){}
Сейчас пользователь может использовать панель уведомлений и кнопку домой и кнопку назад. Доступ к кнопкам домой и назад не страшен, так как кнопка домой возвращает пользователя к приложению, и из меню задач лаунчер (это приложение) закрыть нельзя.
Необходимо заблокировать панель уведомлений или сделать так, чтобы ее использовать было практически невозможно (чтобы пользователь не смог зайти в настройки, выключить Wi-fi и так далее). Есть рут права.
Использовать изоленту, бесцветный лак, ломать тачскрин и другие аппаратные способы блокирования доступа к панели уведомлений использовать нельзя.
Дополнение 1
Использование следующего кода приводит к полному отключению экрана до перезагрузки. Возможно, если команда для отключения только строки состояния?
Java.Lang.Process proc = Java.Lang.Runtime.GetRuntime().Exec( new String[] { "su", "-c", "service call activity 42 s16 com.android.systemui" }); proc.Wait();
Дополнение 2
При использовании программ full!screen и Hide System Bar(Full Screen) программа не отображается. Отображается только картинка рабочего стола и больше ничего до перезагрузки. Планшет Prestigo multipad weze 3341 3g (PMT 3341_3G), android 5.1.1


Ответ

Убил строку состояния приложением Custom Quick Settings и командами под рутом:
settings put secure user_setup_complete 0 settings put global device_provisioned 0