JAVA ile Delphi XE : AutoRun Örneği

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen mrmarman »

Merhaba arkadaşlar.

- JAVA ile Delphi XE ön takısı ile sizlerle paylaşacağım ilk örnek AutoRun Örneği :idea:

:arrow: Kaynak kodlarını; bu linkten zippyshare ile indirebilirsiniz.

:arrow: APK dosyasını ayrıca;bu linkten zippyshare ile indirebilr, direkt telefonunuza kurarak deneyebilirsiniz

Resim

- Aşağıdaki JAVA kaynak kodlarını bir dizi işlemden geçirerek classes.dex dosyasını elde edicez. :idea:

Kod: Tümünü seç

package com.arman.ornek;
 
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
 
public class AutoRun extends BroadcastReceiver
{
@Override
        public void onReceive(Context context, Intent intent) 
        {
           Intent launchintent = new Intent();
           launchintent.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");           
           launchintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           context.startActivity(launchintent);  
        }
 
}
- Embarcadero'nun standart olarak eklediği bir classes.dex dosyası vardır. Yerleri :

Kod: Tümünü seç

c:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex
c:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\release\classes.dex
- Yukarıdaki JAVA kodlarından classes.dex üretmek için aşağıdaki yığın komut dizisini yeniden düzenledim. Çünkü daha önce de bahsettiğim BLONG BLOG'daki servis örneğine ait BUILD.BAT içeriği kurulumunu yaptığım JAVA, Android SDK ve Delphi sürümleri ile maalesef uyuşmadı. :!:

Yeniden düzenlediğim "DEXHazirla.cmd" dosyası içeriğidir : :idea:
- Sorun olursa, SET ile ifade edilen klasör ve dosya isimlerini kendi sisteminizdeki kuruluma göre yeniden düzenlersiniz. :!:
- setlocal ile set edildiğinden sisteminizde kalıcı PATH tanım değişikliği yaşamazsınız. Sadece bu komut dizisi içerisinde set edilir sonra da kendiliğinden unutulur.

Kod: Tümünü seç

@echo Offecho.
echo KULLANIM SEKLi: DEXhazirla src
echo.
Pause
setlocal
set ANDROID_JAR="C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\platforms\android-17\android.jar"
set DX_LIB="C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\build-tools\android-4.2.2\lib"
set EMBO_DEX="C:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex"
set PROJ_DIR=%CD%
set VERBOSE=0
set JAVASDK="C:\Program Files\Java\jdk1.7.0_25\bin"
set DX_BAT="C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\build-tools\android-4.2.2\dx.bat"

echo.
echo * Java kaynak kodlari derleniyor...
echo.
pause
mkdir output 2> nul
mkdir output\classes 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose
%JAVASDK%\javac %VERBOSE_FLAG% -Xlint:all -classpath %ANDROID_JAR% -d output\classes -source 1.6 -target 1.6 %1\*.java 

echo.
echo.
echo * Yeni Class iceren JAR dosyasi Create ediliyor...
echo.
pause
mkdir output\jar 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=v
%JAVASDK%\jar c%VERBOSE_FLAG%f output\jar\arman_classes.jar -C output\classes com

echo.
echo * JAR dosyasi DEX dosyasina donusturuluyor...
echo.
pause
mkdir output\dex 2> nul

if x%VERBOSE% == x1 SET VERBOSE_FLAG=--verbose
call %DX_BAT% --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\arman_classes.dex --positions=lines %PROJ_DIR%\output\jar\arman_classes.jar

echo.
echo * DEX dosyasinda birlestirme yapiliyor...
echo.
pause
%JAVASDK%\java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\arman_classes.dex %EMBO_DEX%

echo.
echo * Islem Tamam.  output\dex\classes.dex dosyasini Delphi'nin varsayilan classes.dex dosyasi yerine kullanabilirsiniz...
echo * Lutfen "AndroidManifest.template.xml" dosyasina <receiver> tagina ekleme yapmayi unutmayin...
echo.

:Exit
endlocal
Resim

* Açılacak Deployment sayfasından aşağıdaki şekilde eski classes.dex başındaki işaret kutusu boşaltılıp yerine köşedeki minik butonlardan EKLEME için olana basarak JAVA klasörü altında OUTPUT\DEX klasöründeki yeni classes.dex dosyasını seçiyoruz.
* Remote Path olarak ".\" olarak belirecektir. Orayı mouse ile edit ederek eskisi ile aynı, yani classes\ ifadesini yazıyoruz.

Resim

* En son olarak da bir defalığına Project / Build All Project diyoruz ki projemize ait bir XML dosyası (AndroidManifest.template.xml) oluşturulsun.
* Bu XML dosyasına da bir ekleme yapıcaz... :idea:

* Aşağıdaki Manifest dosyasında 34 - 40 satırlar (dahil) aralığını biz ekledik.
* <%uses-permission%> gibi % işaretli olanlar Delphi tarafından boşluk doldurma şeklinde kendiliğinden doluyor. Biz Delphi'ye ait olmayan bir manipülasyon yaptığımızdan elle müdahale ediyoruz.

Kod: Tümünü seç

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="%package%"
        android:versionCode="%versionCode%"
        android:versionName="%versionName%">
 
 
    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="%minSdkVersion%" />
<%uses-permission%>
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:installLocation="%installLocation%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%">
        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboardHidden">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="%libNameValue%" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
        <receiver android:name="com.arman.ornek.AutoRun"
                  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
           <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
        </receiver>
    </application>
</manifest>   
<!-- END_INCLUDE(manifest) -->
Eklediğimiz kısımlar : :!:

Kod: Tümünü seç

        <receiver android:name="com.arman.ornek.AutoRun"
                  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
           <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
        </receiver>
- Artık projemiz Deploy edilmeye hazırdır. :idea:

- Direkt telefondan çalıştıracaksanız, öncelikle aşağıdaki resimdeki gibi Android / Target kısmında telefonunuzun göründüğünü ve mouse ile çift tıklayıp Active edildiğinden emin olun.

Resim

- Sonra da direkt CTRL + SHIFT + F9 veya "Run without Debugging" ile Telefona Deploy edin ve çalıştırın.

- Proje en az bir defa çalışınca, telefondan Ekle/Kaldır yapmadığınız sürece daima her açılışta yeniden başlayacaktır.

- Bu JAVA işlemini burada bir defalığına böyle resimlerle anlatıyorum. :idea:

- İlerleyen zamanlarda paylaşılacak diğer örneklerde (Service Programı nasıl yapılır, sistem olayları nasıl yakalanıp Delphi'ye aktarılır vb.) bu aşamaları anlatmayı pass geçip direkt JAVA, Delphi kaynak kodları ve XML Manifest dosyalarında yapılacakları konuşalım istiyorum. :roll:

* Metodoloji hep aynı çünkü. Herkese Android'li günler. :o

Başarılar. :bravo:
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen thelvaci »

Ellerinize sağlık, son derece faydalı bir döküman olmuş.
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen nguzeller »

çok teşekkürler en kısı zamanda deneyecem
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen Hashirama »

Elinize sağlık
Böyle bilgilendirici konuların artması dileğiyle.
mehmetantalya
Üye
Mesajlar: 189
Kayıt: 30 Eyl 2013 10:17

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen mehmetantalya »

Müthişsiniz.Ellerinize sağlık.
mndoza
Üye
Mesajlar: 4
Kayıt: 29 Tem 2010 09:23

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen mndoza »

Hocam selamlar;
örneği tekrar ekleme şansınız var mı? Elinize sağlık örnek için teşekkürler :bravo:
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen kahraman1285 »

Muharrem Bey

Kaynak kodlarını tekrar ekleme imkanınız var mı?

@mrmarman

Up :Noops
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen kahraman1285 »

Up :Noops
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Re: JAVA ile Delphi XE : AutoRun Örneği

Mesaj gönderen AliZairov »

kahraman1285 yazdı:Up :Noops
İyi akşamlar. Hangi sürüm kullanıyorsunuz? Bu örnek eski sürümler için. Sizin yapmanız gereken java kodunu jar haline getirme ve projenize library bölümünden ekleme. Sonra AndroidManifest.template gerekli kod bloklarını yazmanız yeterli olucaktır.
Cevapla