-
Постов
414 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Весь контент Pax Beach
-
Поможете с аргументами?
- 15 ответов
-
- Windows
- Firemonkey
-
(и ещё 1 )
C тегом:
-
Прошу участников поделиться мнениями. При создании приложения только для Windows, как мне узнать, что лучше выбрать VCL или FMX? Повлияет ли мой выбор на дальнейшую жизнь приложения? Приложение для работы с локальной БД SQL Server и получения пакетов из интернета.
- 15 ответов
-
- Windows
- Firemonkey
-
(и ещё 1 )
C тегом:
-
Спасибо большое, хороший полезный класс! Можно еще выложить простой пример использования — создание, инициализация, запуск, остановка, уничтожение? Думаю, очень поможет форумчанам.
-
в PlatformSDK есть helper SQLiteOpenHelper.java, в нем метод getWritableDatabase(). Осталось научиться в сервисе работать с SQLite таким образом. Может есть из вас, кто хорошо разобрался, как импортировать JAVA код в Delphi? /** * Create and/or open a database that will be used for reading and writing. * The first time this is called, the database will be opened and * {@link #onCreate}, {@link #onUpgrade} and/or {@link #onOpen} will be * called. * * <p>Once opened successfully, the database is cached, so you can * call this method every time you need to write to the database. * (Make sure to call {@link #close} when you no longer need the database.) * Errors such as bad permissions or a full disk may cause this method * to fail, but future attempts may succeed if the problem is fixed.</p> * * <p class="caution">Database upgrade may take a long time, you * should not call this method from the application main thread, including * from {@link android.content.ContentProvider#onCreate ContentProvider.onCreate()}. * * @throws SQLiteException if the database cannot be opened for writing * @return a read/write database object valid until {@link #close} is called */ public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null) { if (!mDatabase.isOpen()) { // darn! the user closed the database by calling mDatabase.close() mDatabase = null; } else if (!mDatabase.isReadOnly()) { return mDatabase; // The database is already open for business } } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { db = mContext.openOrCreateDatabase(mName, 0, mFactory, mErrorHandler); } int version = db.getVersion(); if (version != mNewVersion) { db.beginTransaction(); try { if (version == 0) { onCreate(db); } else { if (version > mNewVersion) { onDowngrade(db, version, mNewVersion); } else { onUpgrade(db, version, mNewVersion); } } db.setVersion(mNewVersion); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } onOpen(db); success = true; return db; } finally { mIsInitializing = false; if (success) { if (mDatabase != null) { try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock(); } mDatabase = db; } else { if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } }
-
Rusland, удалось решить эту проблему? Еще есть эта ветка про такое. На Stackoverflow создал вопрос, ждем ответа.
-
Товарищи, вот у меня такой же вопрос, как в сабже. Сервис работает в процессе приложения, должен собирать геокоординаты устройства и писать их в базу SQLite, которая используется и самим приложением, в том числе приложение работает с собранными координатами. Подскажите пожалуйста, как обеспечить доступ к SQLite из программы и из сервиса, в какую папку базу лучше деплоить и как к ней из приложения и сервиса обращаться? P.S.: Приложение работает с базой SQLite, но на устройстве базу найти не могу, ни в каталоге приложения, ни поиском по всему устройству. В чем фокус, может кто знает? procedure TDM.conSQLiteBeforeConnect(Sender: TObject); var dbPath: string; begin {$IF DEFINED(iOS) or DEFINED(ANDROID)} dbPath := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sdb'); {$ENDIF} {$IF DEFINED(MSWINDOWS)} dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, '..\..\..\DataBase\mybase.sdb')); if not FileExists(dbPath) then dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, 'mybase.sdb')); {$ENDIF} conSQLite.Database := dbPath; end;
- 15 ответов
-
- sqlite
- база данных
-
(и ещё 1 )
C тегом:
-
и принтер понял, что это команды переноса строки и перевода каретки?
-
Сервис занимает в памяти 10-15 Мб, процессор не ест пока стоит. Останавливать его большой нужды для своих задач не вижу, кроме сервисной для сисадминов.
-
Проект надо посмотреть, выложите сюда. Без окружения непонятно.
-
Спасибо! Сервис останавливается как надо.
-
Да, этот пример работает. Спасибо. Описанная выше ошибка (не запускается сервис) вылетает, если я с нуля собираю проект. Видимо, как-то классы сервиса присоединять в classes.dex приложения нужно и пересобирать его.
-
Я пробую пример итальянского коллеги, он работает почему-то. В нем, когда убиваешь в памяти приложение, монитор выбрасывает такой Warning: 05-05 13:14:30.008: W/linker(22430): /data/app/com.embarcadero.LocationSensorDemo-1/lib/arm/libProxyAndroidService.so: is missing DT_SONAME will use basename as a replacement: "libProxyAndroidService.so" Антенна GPS пропадает, лог больше ничего не собирает. Сервис самостоятельно не запускается.
-
Rusland, второй способ вылетает с ошибкой, пробую первый способ (подключил в сервисе пропатченные модули ...DD, положил компонент TLocationSensor на форму) → при запуске сервиса вылетает ошибка и приложение закрывается. Подскажите, может я чего-то не сделал, например classes.dex надо как-то перестраивать или еще какие-нибудь ухищрения? Код сервиса простой и лог монитора прилагаю. function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin // JavaService.stopSelf; // Log.D('Serice started?'); if not LocationSensor.Active then LocationSensor.Active := true; Result := TJService.JavaClass.START_STICKY; end; procedure TAndroidServiceDM.LocationSensorLocationChanged(Sender: TObject; const OldLocation, NewLocation: TLocationCoord2D); var M: TMarshaller; begin // if Assigned(NewLocation) then // begin Logi(M.AsUtf8('LogLatitude '+ NewLocation.Latitude.ToString).ToPointer); Logi(M.AsUtf8('LogLongitude '+NewLocation.Longitude.ToString).ToPointer); // end; // Log.D(Format('Coords:%8.8f;%8.8f', [NewLocation.Latitude, NewLocation.Longitude])); end;
-
В названии сервиса нет ошибки? Метод запуска такой префикс класса использует «com.embarcadero.services.». class procedure TLocalServiceConnection.StartService(const AServiceName: string); var LIntent: JIntent; LService: string; begin LIntent := TJIntent.Create; LService := AServiceName; if not LService.StartsWith('com.embarcadero.services.') then LService := 'com.embarcadero.services.' + LService; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString(LService)); TAndroidHelper.Activity.startService(LIntent); end;
-
Я имею ввиду фразу «Странно что после закрытия программы сервис перестает слать координаты - значок GPS пропадает. Хотя в Настройки->Приложения->Работающие я вижу как процесс перезапускается.». Эту проблему удалось решить?
-
Пробую Ваше решение на 10 Update 1, но оно не до конца работает, как я понял из темы (отписался в ветке). А 10.1 Trial не полностью рабочий, снес пока Доктор не одумается или не купим лицензию.
-
Rusland, не нашлось решение этой проблемы?
-
В манифесте приложения есть строчка типа <service android:exported="false" android:name="com.embarcadero.services.Project1" /> Это и есть имя сервиса. Не могу проверить у себя пока — завис на том, как запустить сервис с TLocationSensor
-
А зачем его тут обрабатывать? В этот Intent только ClassName передается. Я предлагал выше из приложения посылать в сервис StopService().
-
В событии сервиса OnStartCommand точно вращается стикер «не перезапускать сервис»?
-
procedure TForm1.Button2Click(Sender: TObject); var LIntent: JIntent; begin Log.D('Try to stop'); LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.MyService')); TAndroidHelper.Activity.stopService(LIntent); end; Так останавливать сервис из приложения подойдет?
-
Посмотрел описание класса https://developers.google.com/android/reference/com/google/android/gms/maps/model/Polyline#developer-guide Может getId в вашем случае не JString возвращает? И я Java не очень знаю, но метод все-таки со скобками лучше вызывать, а не как свойство.
-
На самом деле, вопрос с правильной отрисовкой на Bitmap в Android тоже не удалось решить. Чтобы в приложении Android правильно отображался QR код, пришлось рисовать на канве TImage.Canvas, а не на канве TImage.Bimap.Canvas. Поэтому при сохранении изображения приходится делать screenshot в TBitmap и далее resample в нужно разрешение изображения (через Canvas.DrawBitmap). function TfmMainQRShare.getFinalBitmap(Img: TImage): TBitmap; var b: TBitmap; begin b := Img.MakeScreenshot; result := TBitmap.Create; result.Assign(b); result.SetSize(512,512); if result.Canvas.BeginScene() then try toast('OK'); result.Canvas.Clear(TAlphaColors.White); result.Canvas.Fill.Bitmap.WrapMode := TWrapMode.TileStretch; result.Canvas.DrawBitmap(b, RectF(, , min(b.Width, b.Height), min(b.Width, b.Height)), RectF(, , 512, 512), 1, true); result.Canvas.EndScene; finally result.Canvas.EndScene; end; end; В итоге, при сохранении получаем только часть изображения (видно ниже). Почему оно искажается при ресамплинге, пока не знаю. Если Canvas.DrawBitmap не делать, а сразу result := Img.MakeScreenshot, тогда все ок — но в Bitmap сохраняется вся канва TImage, а не нужная область, что не правильно.