java.lang.NoClassDefFoundError При импорте My aar в другой проект - PullRequest
0 голосов
/ 19 ноября 2018

создайте модуль как Android lib и поместите этот класс в java-файл

public class configuration {


    private Activity context;

    public configuration(Activity activity) {

        this.context = activity;
    }


    @SuppressLint("MissingPermission")
    public boolean checkFirstLanched() {

        SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(context.getString(R.string.monitoringPref), MODE_PRIVATE);

        if (!prefs.contains("isFirst")) {
            prefs.edit().putBoolean("isFirst", false).apply();
            writeLocation();


            return true;
        }

        return false;
    }


    private boolean checkSelfPermission(String permission) {
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
    }

    @SuppressLint("MissingPermission")
    private void writeLocation() {

        if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) && checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)) {
            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

            LocationListener locationListener = new LocationListener() {
                public void onLocationChanged(Location location) {
                    Log.e("location", location.getLatitude() + "");
                }

                public void onStatusChanged(String provider, int status, Bundle extras) {
                    Log.e("onStatusChanged", provider);
                }

                public void onProviderEnabled(String provider) {
                    Log.e("onProviderEnabled", provider);
                }

                public void onProviderDisabled(String provider) {
                    Log.e("onProviderDisabled", provider);
                    checkDeviceLocationIsOn();
                }
            };

            assert locationManager != null;
            locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, locationListener, null);
        }

    }


    public void checkDeviceLocationIsOn() {
        System.out.println("Test running setting request");
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true); //this is the key ingredient

        Task<LocationSettingsResponse> result =
                LocationServices.getSettingsClient(context).checkLocationSettings(builder.build());
        result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
            public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
                try {
                    LocationSettingsResponse response = task.getResult(ApiException.class);
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    // All location settings are satisfied.
                    Log.e("Location", "All location settings are satisfied. The client can initialize location");
                    writeLocation();

                } catch (ApiException exception) {
                    switch (exception.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            try {
                                // Cast to a resolvable exception.
                                ResolvableApiException resolvable = (ResolvableApiException) exception;
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                resolvable.startResolutionForResult(context, 100);
                            } catch (IntentSender.SendIntentException | ClassCastException e) {
                                e.printStackTrace();
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                            Log.e("Location", "SETTINGS_CHANGE_UNAVAILABLE");
                            break;
                    }
                }
            }
        });
    }




}

, и я добавлю эту реализацию в файл libs gradle

implementation 'com.google.android.gms:play-services-location:16.0.0'

этот полный файл gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 27
    publishNonDefault true

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

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

        }
    }

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:support-media-compat:27.1.1'
    implementation 'com.google.android.gms:play-services-location:16.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Я хочу проверить мою библиотеку в другом проекте, поэтому я экспортирую ее в виде файла релиза aar и импортирую в другой проект

, поэтому, когда я запускаю этот код в новом проекте, подобном этому

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        configuration coni = new configuration(this);

        coni.checkFirstLanched();


    }
}

выдает мне эту ошибку, когда Location GPS выключен и должен перейти к отображению диалога, чтобы запросить его включение

ошибка произошла в этой строке в классе configuration.java в моей библиотеке

    LocationRequest locationRequest = LocationRequest.create();

и эта полная ошибка отображается в logcat

java.lang.NoClassDefFoundError: Ошибка разрешения: Lcom / google / android / gms / location / LocationRequest;на com.test.monitoringtool.configuration.checkDeviceLocationIsOn (configuration.java:107) на com.test.monitoringtool.configuration $ 1.onProviderDisabled (configuration.java:94) на android.location.LocationManager $ ListenerTransport._handleMessjj (расположение:369) в android.location.LocationManager $ ListenerTransport.-wrap0 (неизвестный источник: 0) в android.location.LocationManager $ ListenerTransport $ 1.handleMessage (LocationManager.java:236) в android.os.Handler.dispatchMessage (Handler.java:108) на android.os.Looper.loop (Looper.java:166) на android.app.ActivityThread.main (ActivityThread.java:7425) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:245) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)

любой может сказать мнепочему эта ошибка возникает при использовании моей библиотеки в качестве файла aar в другом проекте?

1 Ответ

0 голосов
/ 19 ноября 2018

удалите это @SuppressLint("MissingPermission"), а затем исправьте ваш код.

NoClassDefFoundError происходит от класса, не входящего в путь к классам ... что указывает на то, что он не был упакован вAAR - или AAR не был импортирован должным образом.вам, возможно, придется добавить это к корневому проекту build.gradle, чтобы включить AAR взрыв:

repositories {
    ...
    flatDir {
        dirs "libs"
    }
}

, если только вы не добавите это, вы можете импортировать только JAR оттуда.

имя зависимости просто необходимо дополнить @aar.

api ("com.acme:somelibrary:1.0.0@aar") {
    // transitive = true
}
...