Code läuft unter SDK 27 aber nicht SDK 30

wer112

Top Contributor
Ich habe einen DownloadManager gefunden, wo man Dateien/Apps/Audio downloaden kann. Leider muss ich feststellen, dass dies nicht möglich ist, außer man stellt die tragedSDKVersion auf 27. Ich finde nirgendwo einen Grund, wiso dass nur bei 27 funktioniert. Ich benötige dringend eure Hilfe.

Meine Fragen:

1. Warum geht es nicht, außer wenn man die TragedSDKVersion auf 27 stellt und nicht z.B 30
2. Was kann ich machen, dass es auf jedes Smartphone funktioniert?

Ich schicke euch mal den Code. Dieser geht, solange wie es auf 27 ist.

Java:
String url = "http://www. ..... .de/appsordner/app-release.apk";

        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
        request.setTitle("Download");
        request.setDescription("APK Downloading...");
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "app-release.apk");

        DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);

Und das ist das Mainifest:

Java:
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INSTALL_PACKAGES"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>



    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

Und das ist die App BUILD:

Java:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.1"

    defaultConfig {
        applicationId ".............."
        minSdkVersion 23
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

Ich hoffe, das ihr mir helfen könnt, dass es auf allen Smartphones funktioniert mit der aktuellen targetSDKversion 30.

Ich bin für jede Hilfe sehr dankbar!
 
Wie äußert sich denn das "funktioniert nicht"? Kompiliert es nicht oder gibt es Laufzeitfehler, und in beiden Fällen, wie sieht der Fehler aus?
 
Ansonsten generell mal auch die SKDs dazwischen ausprobieren, wenn ich das richtig lese ist SDK 27 Android 8 und SDK 30 Android 11. Das heißt, du solltest mal bei Android lesen, was sich da alles geändert hat. Für SDK 29->30 findet man z.B. das der Zugriff auf folgende Sachen blockiert wurde: https://developer.android.com/about/versions/11/non-sdk-11#new-blocked

Das sind aber nur die Änderungen von 29->30. Du brauchst auch die Änderungen von 27->28 und 28->29.
 
Wie äußert sich denn das "funktioniert nicht"? Kompiliert es nicht oder gibt es Laufzeitfehler, und in beiden Fällen, wie sieht der Fehler aus?
Wenn ich die App auf t30 habe oder 27 oder 28 bzw. Alles unter ca. 26, dann drücke ich auf den Button und oben in den Benachrichtigung steht sofort fehlgeschlagen. Der DownloadManger kann das nur mit t27 downloaden die Sachen, sonst kommt fehlgeschlagen.
 
Ansonsten generell mal auch die SKDs dazwischen ausprobieren, wenn ich das richtig lese ist SDK 27 Android 8 und SDK 30 Android 11. Das heißt, du solltest mal bei Android lesen, was sich da alles geändert hat. Für SDK 29->30 findet man z.B. das der Zugriff auf folgende Sachen blockiert wurde: https://developer.android.com/about/versions/11/non-sdk-11#new-blocked

Das sind aber nur die Änderungen von 29->30. Du brauchst auch die Änderungen von 27->28 und 28->29.
Das hilft mir nicht und von einem DownloadManger steht nirgendwo. Ich hatte damals ein Problem, mit Wifi und da geht man einfach z.B. auf die developer Android seite zum DownloadManger und sa wird es erklärt. Dort befindet sich auch der Hinweis, bis welche termin funktioniert und ab wann es "geblockt" ist. In diesem Fall habe ich nix gesehen. Die Frage ist, warum geht es nicht unter 27??? Z.B. warum geht es nicht mit 23 oder 24??? Ich denke nicht, das der DownloadManger nur für Api 27 entwickelt wurden ist...
 
Ich hab selber von Android-Entwicklung keine Ahnung -. aber hilfreich wäre:

Was ist der DownloadManager? Ein Komponente von Android? Wenn ja, wo ist die dokumentiert?
Eine Third-Party Library? Wenn ja, wo ist die dokumentiert?

Wenn Fehlgeschlagen steht => Debuggen und logs auswerten, was fehlschlägt. In der Entwicklung ist man (egal wofür man entwickelt) drauf angewiesen, dass man auch unter die Haube (=In Logs, Debug etc.) schauen kann.
 
Was ist der DownloadManager? Ein Komponente von Android? Wenn ja, wo ist die dokumentiert?

Aber das ändert nichts daran, dass die Aussage vom TE bezüglich Fehlersuche einfach nicht ausreicht:
dann drücke ich auf den Button und oben in den Benachrichtigung steht sofort fehlgeschlagen.
Du machst etwas, das fehlschlägt und Du reagierst darauf, dass Du eine Benachrichtigung anzeigst? Oder was genau passiert da? Du bist generell sehr schwer zu verstehen finde ich.
 
Das Video zeigt wie es prima mit t27 funktioniert. Wenn ich es auf 30 habe die termin, dann steht da nicht Download abgeschlossen, sondern Download fehlgeschlagen. Und dann lädt es nicht runter.
 
Also, entweder du bist Nutzer ein Anwendung => An die wenden, die die Anwendung entwickeln
Oder du entwickelst selber => Dann benötigt so eine Meldung der Form "geht nicht" die möglichst exakte Code stelle die nicht geht und falls dort irgendwelche Exceptions geworfen werden die ebenfalls. Ein "An der Oberfläche kommt fehlgeschlagen" reicht da nicht. Sprich du musst mal die Anwendung, die du ja gerade baust, debuggen und schauen an welcher Stelle es exakt mit welchem technischen Grund (ich würde ad-hoc auf eine Exception tippen, die gefangen und in eine Nachricht umgewandelt wird tippen). Ansonsten ist das reines raten unserseits.
 
Was für ein Video?

Und hast Du schon die logs auf dem System geprüft? Auch der DownloadManager sollte da entsprechende Informationen loggen.

Oder Du kannst die Id, die enqueue zurücl gibt, merken. Dann kannst Du mittels query einen Cursor bekommen mit den Details. Ich habe jetzt nicht geprüft, was da der downloadmanager im Detail zurück gibt.

Du prüfst immer in der gleichen VM / dem gleichen Smartphone? Oder hast Du unterschiedliche Testsysteme? Ich würde erwarten, dass der DownlaodManager selbst die Prüfung auf valide Downloads durchführt, aber evtl. macht das SDK da auch noch irgendwas. Evtl. gibt es in der neueren SDK Version eine Prüfung, was herunter geladen wird. Da Du ja eine apk Datei herunter laden willst, kann es hier ggf. zu Problemen kommen. Aber das würde ich eigentlich innerhalb von Android / dem DownloadManager erwarten. (Android hat halt Settings bekommen a.la. "download apks from unsecure locations" (oder so ähnlich).
 
Ein "An der Oberfläche kommt fehlgeschlagen" reicht da nicht. Sprich du musst mal die Anwendung, die du ja gerade baust, debuggen und schauen an welcher Stelle es exakt mit welchem technischen Grund (ich würde ad-hoc auf eine Exception tippen, die gefangen und in eine Nachricht umgewandelt wird tippen). Ansonsten ist das reines raten unserseits.
Ich fürchte, er sieht nicht mehr. Er gibt nur einen Download Request an den DownloadManager so wie ich es verstehe. Damit obliegt es komplett der Systemkomponente DownloadManager. Der Download wird also nicht von seiner App selbst durchgeführt.
 
Ich fürchte, er sieht nicht mehr. Er gibt nur einen Download Request an den DownloadManager so wie ich es verstehe. Damit obliegt es komplett der Systemkomponente DownloadManager. Der Download wird also nicht von seiner App selbst durchgeführt.

Dort sind die zwei Videos, wo es funktioniert(nur bei t27) und das andere, wie es nicht funktioniert(bei t30 muss eigentlich immer t30 sein)

Ich habe die Log Daten genommen und die DownloadManager Rausgefiltert. Ich habe ein Teil des Logos in die Datei gepackt und die URL sowie 📦 auf hhhh geändert....

Somit könnt ihr was sehen oder wissen, was ich nicht weiß bzw. Wie ich das Problem löse.
 

Anhänge

Vermutlich ist’s schon: „Stop requested with status BAD_REQUEST: Cleartext traffic not permitted for package com.hhhhhh.hhhh: http://www.hhhhh.de/...“

Was willst du damit sagen? Der letzte Kommentar auf der Seite hat eine http angegeben, was bei mir der Fall ist. Der Code funktioniert ja, aber nur wenn die termin auf 27 ist... Was soll ich jetzt tun, damit es bei t30 ebenfalls funktioniert?
 

Zurück
Oben