Страницы

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

среда, 8 мая 2019 г.

Проверить установку пакета

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


Ответ

Проверка на то, установлено ли приложение:
boolean installed = appInstalledOrNot("com.Example.kek");
private boolean appIsInstalled(String uri) { PackageManager pm = getPackageManager(); boolean app_installed; try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); app_installed = true; } catch (PackageManager.NameNotFoundException e) { app_installed = false; } return app_installed; }

Как добавить файл в 7-zip архив с сохранением структуры каталогов?

Использую SevenZipSharp
SevenZipCompressor.SetLibraryPath("7z.dll"); SevenZipCompressor szc = new SevenZipCompressor(); szc.DirectoryStructure = true; szc.PreserveDirectoryRoot = true; szc.ZipEncryptionMethod = ZipEncryptionMethod.Aes256; szc.CompressionMode = CompressionMode.Create;
Если добавить несколько файлов сразу, то каталоги создаются нормально
szc.CompressFilesEncrypted("test.7z", "123", @"C:\Test\Test2\123.txt", @"C:\Test\Test\123.txt", @"C:\Test\123.txt");
А если добавлять по одному, то все файлы записываются в корень архива.
szc.CompressFilesEncrypted("test.7z", "123", @"C:\Test\Test2\123.txt"); szc.CompressionMode = CompressionMode.Append; szc.CompressFilesEncrypted("test.7z", "123", @"C:\Test\Test\123.txt"); szc.CompressFilesEncrypted("test.7z", "123", @"C:\Test\123.txt");
В итоге получается 3 файла 123.txt в корне.
Что я делаю не так? Как добавлять по одному файлу с сохранением полного пути?


Ответ

Нужно передавать длину общего пути для всех файлов:
string commonPath = "C:\\Test\\"; int commonPathLength = commonPath.Length;
szc.CompressFilesEncrypted("test.7z", commonPathLength, "123", @"C:\Test\Test2\123.txt"); szc.CompressionMode = CompressionMode.Append; szc.CompressFilesEncrypted("test.7z", commonPathLength, "123", @"C:\Test\Test\123.txt"); szc.CompressFilesEncrypted("test.7z", commonPathLength, "123", @"C:\Test\123.txt");

Судя по исходникам (к сожалению, у проекта нету документации), метод CompressFilesEncrypted отличает часть пути, которая принадлежит архиву, от части пути внутри архива, при помощи вычисления общей части пути всех переданных файлов.
public void CompressFilesEncrypted( string archiveName, string password, params string[] fileFullNames) { CompressFilesEncrypted(archiveName, CommonRoot(fileFullNames), password, fileFullNames); }
То есть, если переданы файлы C:\Test\Test2\123.txt и C:\Test\Test4\123.txt, то общей частью будет C:\Test\. А вот для одного файла общей частью оказывается весь путь.
Поэтому и приходится вычислять нужную общую длину вручную, и передавать, используя перезагрузку с длиной.

java.text.ParseException: Unparseable date

Столкнулся с проблемой, не работает следующий java - код:
String s_date = " Ср, 16 12 2015 16:24:31 GMT"; SimpleDateFormat sdf = new SimpleDateFormat( " dd MM yyyy hh:mm:ss " ); Date date = sdf.parse( s_date ); System.out.println( sdf.format( date ) );
Выкидывает:
java.text.ParseException: Unparseable date: " Ср, 16 12 2015 16:24:31 GMT"
Можно конечно обрезать первые пять символов и последние четыре. Но у меня будет много разных форматов дат, и для каждой разный подход. Как сделать чтобы SimpleDateFormat.parse(), парсил только то что указано?
Если в коде не видно, я в задании шаблона подставил 5 пробелов в начале и 4 в конце, это не помогло.


Ответ

Конкретно в вашем случае надо править форматную строку:
// было: "dd MM yyyy hh:mm:ss" // модификации: EEE - день недели строкой, HH - час 0-23, zzz - временная зона SimpleDateFormat sdf = new SimpleDateFormat( " EEE, dd MM yyyy HH:mm:ss zzz", new Locale("ru", "RU") ); Date date = sdf.parse( s_date ); System.out.println( sdf.format( date ) ); //Вывод: Ср, 16 12 2015 19:24:31 MSK
Новое API:
DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern( "E, d M y H:m:s z", new Locale("ru", "RU") ); ZonedDateTime newDate = ZonedDateTime.parse( s_date.trim(), newFormatter ); System.out.println( newFormatter.format( newDate )); // Вывод: Ср, 16 12 2015 16:24:31 GMT

Режет форму на разных ОС (Win7/Win10)&Win8.1

Написал небольшое приложение. И на кросс-платформенности споткнулся. Что имеем:
Win10, разрешение 1366х768

Win10, разрешение 800х600

А теперь Win8.1, разрешение 1920х1080
На Win8 срезает кусок формы, тем самым пропадает кнопка нижняя и боковая, что вообще неприемлемо, да и textbox-ы подрезает немного. Платформа .NET 2.0 (нужна именно она, перекомпилить в .NET 4+ не вариант). На Win7 c разрешением 1920*1080 все норм! В чем проблема может быть?


Ответ

Решил установкой значения Inherit для свойства AutoScaleModeв формах

Регулярные выражения в форме регистрации

Как учесть только латиницу или кирилицу?
Есть форма регистрации, мне нужно учесть только русские или латинские буквы, но смешивать их нельзя. Пример: "Lexans" и "Алексей" - разрешено, а "Lexaнс" - нет!
Вот как такое учесть?


Ответ

/^([A-Za-z]+|[А-Яа-я]+)$/u Вот такая регулярка

Кроссплатформенность битовых операций

Как добиться кроссплатформенности при сериализации, работе напрямую с битами, составления пакетов для отправки между классами при условии, что битовые манипуляции должны быть верны при little endian и big endian


Ответ

При общении в пределах одной системы учитывать порядок байт нет смысла. все потоки, процессы и т.п. работают с одним порядком. Вопрос встает только при передаче информации на другую платформу. Т.е. данные должны быть приведены к заранее оговоренному порядку байт только при передаче по сети или при записи в файлы, которые могут быть впоследствии перенесены на другую систему.

Как вставить запись в таблицу MySQL с учетом сортировки по алфавиту?

Есть некая картотека людей:

Суть картотеки состоит в том, чтобы хранить такие вот карточки, в каждой из которых записаны по три фамилии изначально. Каждая карточка пронумерована. Фамилии в карточках и картотеке в целом расположены в порядке сортировки по афавиту.
В MySQL таблица хранящая данную картотеку выглядит так:
id card_number (номер карточки) position (позиция фамилии в карточке) surname (фамилия)
Задача: добавить новую фамилию в картотеку с сохранением позиций фамилией, которые там уже есть, но в ближайшую по сортировке карточку.
К примеру, нам нужно добавить фамилию "Иващенко" Фамилия Иващенко по правилам сортировки должна быть после Иванов и перед Илитаев, но так как нам нельзя менять порядок уже существующих в карточке фамилий, то мы должны просто добавить её в конец карточки №1, после фамилии "Илитаев"
В итоге получается мне нужно каким-то образом для заданной фамилии (например для "Иващенко" №1) определить номер карточки в которую я собираюсь добавить эту фамилию.


Ответ

select * from card where surname=( select max(surname) from card where surname<'Иващенко' )
Даст ту же запись, которую дал бы приведенный вами PHP алгоритм. Если надо определять некие "расстояния" между фамилиями - что бы найти действительно "ближайшую", то вам и на PHP придется попотеть. Но это в принципе то же решаемо. Например вы можете аналогичным SQL запросом получить запись идущую после вставляемой и уже между ними двумя на php вычислять какая "ближе"
Если приведенный запрос не вернул ни одной записи, значит задали фамилию которая должна быть первой в картотеке. Т.е. такую запись надо точно добавлять в первую карточку картотеки.