Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Java İle Android Program Tetikleme
#1
Information 
Herkese selamlar,

Bu makalemde sizlere Java ile uygulamanızı nasıl tetikleyeceğinizi anlatacağım. Rus bir eleman sağolsun(Rusçada olsa resimlerden falan anlamaya çalıştım) makalesinden yapmış olduğu aşamaları sizinle de paylaşmak istedim. 

İlk olarak mantığını anlamak gerekirse bir Java dosyası derlemesi yapacağız ve Delphi IDE'si aracılığı ile library bölümüne ekleyeceğiz. Sonrasında bu dosyayı tetikleyerek, uygulamamızın açılmasını sağlayacağız.

Exclamation  1. Aşama: Java Derleme

 Bu aşamada bir klasör oluşturarak daha rahat çalışmanızı tavsiye ediyorum. Notepad uygulamasını(veya başka bir düzenleme programı. Ben EditPlus3 kullanıyorum.) açararak aşağıda ki Java derleme kodlarınız yazıyoruz.

@echo off
setlocal

if x%ANDROID% == x set ANDROID=E:\Program Files (x86)\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows
set ANDROID_PLATFORM=%ANDROID%\platforms\android-27
set PROJ_DIR=%CD%
set VERBOSE=0

echo.
echo Compiling the Java service activity source files
echo.
mkdir output 2> nul
mkdir output\classes 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose
javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\ServiceExample\ServisExample.java

echo.
echo Creating jar containing the new classes
echo.
mkdir output\jar 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=v
jar c%VERBOSE_FLAG%f output\jar\ServisExample.jar -C output\classes com

echo.
echo Now we have the end result, which is output\jar\ServisExample.jar

:Exit

pause

endlocal

Exclamation Önemli Not: Belirtilmiş olan olan SDK ve Java yollarını kendinize göre ayarlamanız gerekmektedir. Şu anda benim standart olarak kullanmış olduğum yerler mevcut.

Idea İpucu: Kısayoldan "Delphi IDE> Tools> Options> SDK Manager" bölümünden tanımlı yolları bulabilirsiniz. 

Exclamation Önemli Not: Java derlemesi için gerekli komutları tanımlamanız gerekmektedir. "Bilgisayar> Özellikler> Gelişmiş> Ortam Değişkenleri" yolunu takip ederek, "Path" bölümünü düzenlemeniz gerekmektedir. Aşağıdaki resimde göründüğü gibi Java/bin klasörünü tanımlıyorsunuz. Unutmayın ki; her yol belirtilişinde ";" kullanılmaktadır.


nOOVrM.png

"Build" olayını hallettiğimize göre artık gerekli dosyaları oluşturabiliriz. "Build" kodunda belirtlien "src\com\ServiceExample\ServisExample.java" yoluna göre klasör açalım(İsteğe bağlı olarak kısaltılıp, değiştirilebilir.). En son klasörün içine ".java" uzantılı bir dosya ekleyelim(Herhangi bir editör ile). Java dosyamızın içeriği aşağıda bulunmaktadır.

package com.ServiceExample;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ServisExample extends BroadcastReceiver {
   public void onReceive(Context context, Intent intent) {
           Intent TestLauncher = new Intent();
           TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
           TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           context.startActivity(TestLauncher);
   }
}

 Burada bir "Intent" oluşturulup TestLauncher olarak tanımlanıyor. Sonrasında FLAG_ACTIVITY_NEW_TASK ile yeni bir işlem(uygulamamızın açılması için) oluşturup. Context.StartActivity komutu ile TestLauncher tanımlı uygulamayı tetikliyor. 

Exclamation Önemli Not: Belirtlien Class ismine dikkat etmeniz gerekmekte şu anda "ServisExample" olarak tanımlı. Bu tanımı Delphi'de çağırma işleminde kullanacağız.

Bu işlemlerin ardından artık "Build.bat" dosyamızı çalıştırmamız da bir sorun yok. Dosya çalıştıktan sonra; otomatik oluşan "output\jar" yolunda Delphi'de kullanacağımız Java kütüphanesi oluşmuş olarak görmeniz gerekmektedir.

  Java kısmı biter  Blush 


Exclamation 2. Aşama: Delphi Kısmı
 
Delphi'yi açarak işlemlerimize başlayalım. Hemen bir Android uygulama oluşturup, formumuzun içine bir tane buton ekleyelim. 

jyyPaG.png

"Project Manager> TargetPlatforms> Android - Android SDK xx> Libraries" yolunu izleyerek, oluşturmuş olduğumuz ".jar" dosyasını projemize ekliyoruz. Bu aşamalardan sonra yapmamız gereken küçük bir değişiklik olacak. Projemizi bir "Build" edelim. Proje klasörüne gittiğimizde bir dosya göreceksiniz; "AndroidManifest.template.xml" adlı dosyayı editör ile açıp gerekli düzenlemeleri yapın.

JQQr05.png

Exclamation Önemli Not: Resim göründüğü bölümde Java kodumuzu yazarken kullanmış olduğum(ilk satırda ki koddan bahsediyorum) "package com.ServiceExample" kodu ile Class olarak tanımladığımız "ServisExample" isimlerini birleştirerek Class yapımızı tanımlıyoruz. 

bkz. (Birleşimi; com.ServiceExample.ServisExample).

  Devam edelim...

Şimdi ise Android sistemin takvim metodunu kullanarak, fonksiyonumuzu oluşturuyoruz ki mili saniyeyi, saniyeye çevirebilelim.

function getTimeAfterInSecs(Seconds: Integer): Int64;
var
 Calendar: JCalendar;
begin
 Calendar := TJCalendar.JavaClass.getInstance;
 Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
 Result := Calendar.getTimeInMillis;
end;

 Bu fonksiyonumuzu ekledikten sonra artık rahatça kodumuzu yazabiliriz.

procedure TfrmMain.Button1Click(Sender: TObject);
var
 Intent: JIntent;
 PendingIntent: JPendingIntent;
begin
 Intent := TJIntent.Create;
 Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
 PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 1, Intent, 0);
 TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(10),
   PendingIntent);
end;

Prosedürü açıklayacak olursam; bu prosedür ile biz yazmış olduğumuz Java dosyamızda ki kodu time ile tetikleyip, RTC_WAKEUP ile çalıştırıyoruz. Java dosyamızda "Intent" ile işlem yaptığımız için Delphi ile de "Intent" yapısını kullanarak bir nevi iletişime geçmesini sağlıyoruz. StringToJString ile Class ismini alıyor ve işimize bakıyoruz. "getTimeAfterInSecs(10)" kodu ile 10 saniye sonra programımızın açılmasını istediğimizi bildiriyoruz. Sonrasında ise işlemlerimiz tamam...

Bu makale bir servis niteliği taşımaz. Sadece tetikleme niteliği taşır ve bu işlemler ile programınızı "RECEIVE_BOOT_COMPLETED" iznini ve "BOOT_COMPLETED" eylemini yakalayarak işleminizi gerçekleştirebilirsiniz.

Bu araştırma için yaklaşık 5 günlük bir zaman harcadım. Bu araştırmalarımda bana yardımcı olan;

Uğur PARLAYAN (Çeviri için)  Blush

Fesih ARSLAN (İpin ucunu elime verdiği için)  Big Grin

gonulali (Kaynak yardımı için)  Heart

   Teşekkür ederim...

Şimdi biraz bu olay hakkında konuşmaya gelirsek. Delphi'nin bu konu hakkında biraz yetersiz kaldığını düşünüyorum çünkü herhangi bir dilden yardım almadan bağımsız olarak (en azından bu kadar uğraştırmadan) olayı halletmesi gerekirdi. Yani birkaç sürüme artık bu olaya el atması gerek çünkü önemli konulardan bir tanesi. 

Umarım bu makale ile umarım yardımcı olabilmişimdir. Ben aşağıya yine de incelemeniz bakımından bırakayım.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol | GitHub


Blush  Destek için GitHub üzerinden projeyi yıldızlayabilir ve REP puanı ile süsleyebilirsiniz. 

m22lvR.png


Yaralandığım Kaynaklar:

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol


Saygılarımla,
İyi çalışmalar.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#2
Merhaba,
DelphiCan'a bu değerli kaynağı kazandırdığınız için teşekkür ederiz. Beş günlük emeğiniz, bu işlemi yapmak isteyen bir DelphiCan'a 5 gün kazandıracak demektir.  Shy

(17-02-2018, Saat: 22:55)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol...
Şimdi biraz bu olay hakkında konuşmaya gelirsek. Delphi'nin bu konu hakkında biraz yetersiz kaldığını düşünüyorum çünkü herhangi bir dilden yardım almadan bağımsız olarak (en azından bu kadar uğraştırmadan) olayı halletmesi gerekirdi. Yani birkaç sürüme artık bu olaya el atması gerek çünkü önemli konulardan bir tanesi. 

Aslında yaptığınız işlem adımlarına bakarsanız, Delphi'nin çok doğru bir yöntem izlediğini görürsünüz. Android platformunun altında Library kısmının olması; tüm derlemiş java kodlarının tıpkı bir API gibi kullanabileceği manasına geliyor. Delphi içerisinde tüm java kodları veya metodları olamaz, ama tüm derlemiş java kodları kullanılabilir. Bundan daha iyisi olamaz bence.
Aslında Delphi bu durumu diğer platformlar içinde uygulamıştır. Platforma özgü API veya içerdiği metod bir Unit içerisinde platform kütüphanesine (dll, dylib, so, a vb.) referanslıdır.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
(17-02-2018, Saat: 23:26)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,
DelphiCan'a bu değerli kaynağı kazandırdığınız için teşekkür ederiz. Beş günlük emeğiniz, bu işlemi yapmak isteyen bir DelphiCan'a 5 gün kazandıracak demektir.  Shy

(17-02-2018, Saat: 22:55)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol...
Şimdi biraz bu olay hakkında konuşmaya gelirsek. Delphi'nin bu konu hakkında biraz yetersiz kaldığını düşünüyorum çünkü herhangi bir dilden yardım almadan bağımsız olarak (en azından bu kadar uğraştırmadan) olayı halletmesi gerekirdi. Yani birkaç sürüme artık bu olaya el atması gerek çünkü önemli konulardan bir tanesi. 

Aslında yaptığımız işlem adımlarına bakarsanız, Delphi'nin çok doğru bir yöntem izlediğini görürsünüz. Android platformunun altında Library kısmının olması; tüm derlemiş java kodlarının tıpkı bir API gibi kullanabileceği manasına geliyor. Delphi içerisinde tüm java kodları veya metodları olamaz, ama tüm derlemiş java kodları kullanılabilir. Bundan daha iyisi olamaz bence.
Aslında Delphi bu durumu diğer platformlar içinde uygulamıştır. Platforma özgü API veya içerdiği metod bir Unit içerisinde platform kütüphanesine (dll, dylib, so, a vb.) referanslıdır.

 Hocam haklısınız ama en azından derleme(build.bat) aşamasında ki kodlar, java içine yazılan class için bir kısayol sunabilir veya kendi resmi sitesinde bunun makalesine yayınlayabilir. Rusça zor bir dil  Smile Smile
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#4
Aslında Delphi XE7'den beri Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bir araç (Java2OP) sunmuştu.
Anladığım kadarıyla, bu işe (platform kodlarının entegrasyonundaki güçlük ve hammaliyeden dolayı) çok da bulaşmak istemiyor.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
(17-02-2018, Saat: 23:37)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAslında Delphi XE7'den beri Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bir araç (Java2OP) sunmuştu.
Anladığım kadarıyla, bu işe (platform kodlarının entegrasyonundaki güçlük ve hammaliyeden dolayı) çok da bulaşmak istemiyor.

Yine Delphi'nin bir tanıtım faciasına denk gelmişim. Birçok makale okumama rağmen bu konuda böyle bir aracın olduğu söylenmedi. Teşekkürler üstat bilgi için Smile
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#6
(17-02-2018, Saat: 23:42)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(17-02-2018, Saat: 23:37)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAslında Delphi XE7'den beri Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bir araç (Java2OP) sunmuştu.
Anladığım kadarıyla, bu işe (platform kodlarının entegrasyonundaki güçlük ve hammaliyeden dolayı) çok da bulaşmak istemiyor.

Yine Delphi'nin bir tanıtım faciasına denk gelmişim. Birçok makale okumama rağmen bu konuda böyle bir aracın olduğu söylenmedi. Teşekkürler üstat bilgi için Smile

Rica ederim. Sana verdiğimiz bilgiler bize misliyle geri dönüyor. Emek ve desteklerin için tekrar teşekkürler.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#7
(18-02-2018, Saat: 00:31)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(17-02-2018, Saat: 23:42)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlYine Delphi'nin bir tanıtım faciasına denk gelmişim. Birçok makale okumama rağmen bu konuda böyle bir aracın olduğu söylenmedi. Teşekkürler üstat bilgi için Smile

Rica ederim. Sana verdiğimiz bilgiler bize misliyle geri dönüyor. Emek ve desteklerin için tekrar teşekkürler.

 Ben teşekkür ederim hocam, bana sağlamış olduğunuz desteklerden ötürü  Shy
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firemonkey Android ile OCR ve Mifare - NFC - RFID Kütüphaneleri Abdullah ILGAZ 14 818 03-09-2018, Saat: 12:42
Son Yorum: adelphiforumz
  Android APİ sorunu - Google Play BY-HAYALET 23 1.119 23-08-2018, Saat: 18:54
Son Yorum: narkotik
  Tablette program kapanıyor hbulus 8 264 13-08-2018, Saat: 11:02
Son Yorum: Abdullah ILGAZ
  Program kapanırken access violation veriyor TDeveloper 7 780 12-08-2018, Saat: 14:58
Son Yorum: yhackup
  Tokyo Android Kurulumunda aldığım hata hakkında adelphiforumz 8 257 01-08-2018, Saat: 10:56
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi