Android Hedef Target Android 12 Hatası Çözümü

android:exported needs to be explicitly specified for element <activity#com.embarcadero.firemonkey.FMXNativeActivity>. Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

Bu hata mesajı, Delphi 12.3 ile Android 12 veya üzeri sürümler için uygulama geliştirirken, AndroidManifest.xml dosyanızda bazı activity öğelerinde android:exported niteliğinin eksik olduğunu bildiriyor.

Sorun Nedir?

Android 12 (API 31) itibarıyla, bir Activity, Service veya BroadcastReceiver bileşeni eğer bir intent-filter içeriyorsa, android:exported niteliğinin açıkça tanımlanması zorunludur. Bu nitelik, bileşenin uygulama dışından erişilebilir olup olmadığını belirler.

hatanda belirtilen öğe:

<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" ...>

Bu aktivite bir intent-filter içerdiği için, artık android:exported özelliğini içermesi gerekiyor.

Ne Yapmalısın?

  1. AndroidManifest.template.xml dosyanı aç.
  2. Aşağıdaki gibi FMXNativeActivity için tanımlı activity öğesini bul:
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
          android:label="@string/app_name"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:launchMode="singleTop">

Bu satıra android:exported="true" (veya gerektiğinde false) ekle:

<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
          android:label="@string/app_name"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:launchMode="singleTop"
          android:exported="true">

Bu şekilde düzenleme yapıldığında hata ortadan Kalkar

Js Tablo yazdırma Scripti

Html Sayfalarda bir tablo id ile tetiklendiğinde tablo içeriğini yazdırmaya aktaran script

<script>
function PrintTable(tabloId) {
    let table = document.querySelector(tabloId);
    if (!table) {
        console.error("Tablo bulunamadı: " + tabloId);
        return;
    }

    let printWindow = window.open('', '', 'width=800,height=600');
    printWindow.document.write('<html><head><title>Tablo Yazdır</title>');
    printWindow.document.write('<style>');
    printWindow.document.write('table { border-collapse: collapse; width: 100%; }');
    printWindow.document.write('th, td { border: 1px solid black; padding: 8px; text-align: left; }');
    printWindow.document.write('</style></head><body>');
    
    printWindow.document.write(table.outerHTML); // Sadece tablonun içeriğini ekler
    printWindow.document.write('</body></html>');
    
    printWindow.document.close();
    printWindow.print();
}
</script>

Örnek Kullanımı

	<button onclick="PrintTable('#Tablo1')">Yazdır</button>
Js Tablodan Pdf Aktarım Scripti

Html Sayfalarda bir tablo id ile tetiklendiğinde tablo içeriğini pdf aktaran script

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.27/jspdf.plugin.autotable.min.js"></script>

<script>


function TabloPDF(tabloId, dosyaAdi = "tablo.pdf") {
    let table = document.querySelector(tabloId);
    if (!table) {
        console.error("Tablo bulunamadı: " + tabloId);
        return;
    }

    let { jsPDF } = window.jspdf;
    let doc = new jsPDF();
	  doc.addFont('font/roboto.ttf', 'Roboto', 'normal');
  doc.setFont("Roboto", "normal");
 
 ;
    doc.autoTable({
        html: table ,
        styles: {
            font: "Roboto", // Alternatif: "times"
            fontStyle: "normal"
        }
    });

    doc.save(dosyaAdi);
}
</script>

Örnek Kullanımı

&lt;button onclick="TabloPDF('#Tablo1')">PDF İndir&lt;/button>
Js Tablodan Excel Aktarım Scripti

Html Sayfalarda bir tablo id ile tetiklendiğinde tablo içeriğini excele aktaran script

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script>
function TabloExcel(tabloId, dosyaAdi = "tablo.xlsx") {
    let table = document.querySelector(tabloId);
    if (!table) {
        console.error("Tablo bulunamadı: " + tabloId);
        return;
    }

    let wb = XLSX.utils.book_new();
    let ws = XLSX.utils.table_to_sheet(table);
    XLSX.utils.book_append_sheet(wb, ws, "Sayfa1");

    XLSX.writeFile(wb, dosyaAdi);
}
</script>

örnek Kullanımı

  <button onclick="TabloExcel('#Tablo1')">Excel İndir</button>
Sql Server Tablo Boyutlarını Gösteren Sorgu

Aşağıdaki Sql Scriptini Kullanarak Hangi Tabloda Kaç Satır var MB olarak Ne Kadar Yer Kaplıyor öğrenebilirsiniz

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    (SUM(a.total_pages) * 8) / 1024 AS TotalSizeMB,
    (SUM(a.used_pages) * 8) / 1024 AS UsedSizeMB,
    (SUM(a.data_pages) * 8) / 1024 AS DataSizeMB
FROM 
    sys.tables t
INNER JOIN 
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.is_ms_shipped = 0
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    TotalSizeMB DESC;
Databasedeki Tüm İndexleri Create Kodu ile Alma SQL Script

Bu script ile Sql Server daki Database ait tüm NONCLUSTERED indexleri listeleyip create kodlarını alabilirsiniz

SELECT 
    DB_NAME() AS DatabaseName, -- Veritabanı adı
    OBJECT_SCHEMA_NAME(i.object_id) + '.' + OBJECT_NAME(i.object_id) AS TableName, -- Şema ve tablo adı
    i.name AS IndexName, -- İndeks adı
    'CREATE ' + 
    CASE WHEN i.is_unique = 1 THEN 'UNIQUE ' ELSE '' END + 
    'NONCLUSTERED INDEX [' + i.name + '] ON ' + 
    OBJECT_SCHEMA_NAME(i.object_id) + '.' + OBJECT_NAME(i.object_id) +
    ' (' + 
    STUFF((
        SELECT ', ' + c.name
        FROM sys.index_columns ic
        JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
        WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.is_included_column = 0
        ORDER BY ic.key_ordinal
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') +
    ')' +
    CASE 
        WHEN EXISTS (
            SELECT 1
            FROM sys.index_columns ic2
            WHERE ic2.object_id = i.object_id AND ic2.index_id = i.index_id AND ic2.is_included_column = 1
        ) THEN 
        ' INCLUDE (' + 
        STUFF((
            SELECT ', ' + c2.name
            FROM sys.index_columns ic2
            JOIN sys.columns c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id
            WHERE ic2.object_id = i.object_id AND ic2.index_id = i.index_id AND ic2.is_included_column = 1
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + 
        ')' 
        ELSE '' 
    END AS CreateIndexScript
FROM 
    sys.indexes i
WHERE 
    i.type = 2 -- Non-clustered indeksler
ORDER BY 
    DatabaseName, TableName, IndexName;