应用只能在API 28上运行,而不能在26上运行

时间:2019-02-16 15:00:23

标签: java android

我是这里的新手(即使我已经阅读了很多主题),并且像一个月前一样,我开始使用Java和Android Studio进行开发。

我在这里发布内容是因为尽管我可以做所有的研究,但找不到任何解决方案。我的应用程序可以在API 28上正常运行,但不能在API 26上运行。

这是我的问题:我想创建第一个应用程序以获得更多应用程序的经验。我做了一个具有第一个活动的游戏,其中您必须单击播放以继续进行第二个活动,即带有一些imageButton的游戏,并且您必须单击一个带有计时器的得分,该计时器在您每次得分时都会减少。

我想和一群朋友分享这个游戏。他们都有配备android 8.0 minimun的android手机。因此,在启动新项目时,我已经选择了API26上的最低API级别。它可以完美地在具有API 26和API 28的虚拟设备上运行,但到目前为止,它仅在具有API28的真实手机上运行。

为解决此问题,我尝试将最低API级别降低到24。但是它也不起作用。

然后,经过一些阅读,我尝试更改 Project Structure => App => Properties 中的项目结构,并为Compile SDK版本设置了Android 8.0,并在 Flavors <中设置了Android 8.0。 / em> => 最小SDK版本目标SDK版本

我遇到了这个错误

  

Android资源链接失败   app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values-v28 \ values-v28.xml:7:错误:未找到资源android:attr / dialogCornerRadius。

     

app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values-v28 \ values-v28.xml:11:错误:未找到资源android:attr / dialogCornerRadius。

     

app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values \ values.xml:2739:错误:未找到资源android:attr / fontVariationSettings。

     

app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values \ values.xml:2740:错误:未找到资源android:attr / ttcIndex。

     

错误:链接引用失败。

然后我更改了这一行:

  

实现'com.android.support:appcompat-v7:28.0.0'

作者

  

实现'com.android.support:appcompat-v7:26.0.0'

然后,它可以在具有API 26和API 28的虚拟设备上运行,但仍不能在具有API 26的真实设备上运行。 该应用程序从第一个活动开始,当人们单击播放时,它将关闭。

所以现在我不知道如何使它工作。

另一个有趣的事实是,当我生成与朋友共享的APK文件时,我会执行 Build =>生成签名包或APK ,然后选择 APK 我生成了APK文件。如果我与WhatsApp Web共享,则使用API​​ 28的人只能将其下载为ZIP,如果我将其下载到手机上,然后与WhatsApp共享,则适用于他们。

感谢您的阅读。 我不是英语母语人士,所以如果您不了解或不需要某些内容,请问我,我很乐意为您提供解决此问题的任何方法:)

编辑:这是代码:

主要活动:

package com.example.taphypv123;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private Button jouer;


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

    this.jouer=findViewById(R.id.jouer);

    jouer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent Game = new Intent(getApplicationContext(), Game.class);
            startActivity(Game);
            finish();
        }
    });
}
}

然后进行Game活动:

package com.example.taphypv123;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Intent;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Game extends AppCompatActivity {

private Game activity;

private Integer[] boquette={
        R.drawable.imi1,
        R.drawable.imi2,
        R.drawable.imi3,
        R.drawable.imi4,
        R.drawable.imi5,
        R.drawable.imi6,
        R.drawable.imi7,
        R.drawable.imi8,
        R.drawable.imi9};        

private Integer[] hyppieState ={
        R.drawable.imia1,
        R.drawable.imia2}; 

private List<Integer> melange = new ArrayList<>();  
Integer tab[] = new Integer[melange.size()];
private TextView point;
private ImageButton imi1,imi2,imi3,imi4,imi5,imi6,imi7,imi8,imi9;

private int j=0;

ProgressBar mProgressBar;
CountDownTimer mCountDownTimer;
int time =5000;

private ObjectAnimator mAnimation;

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


    // Définition du timer
    mCountDownTimer=new CountDownTimer(time,100) {
        @Override
        public void onTick(long millisUntilFinished) {

        }

        @Override
        public void onFinish() {
            Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
            startActivity(MainActivity);
            Toast.makeText(getApplicationContext(),"Trop lent"+point.getText(),Toast.LENGTH_SHORT).show();
            finish();
        }
    };


    //Définition de la barre de progression
    mProgressBar=findViewById(R.id.progressBar6);
    mAnimation=ObjectAnimator.ofInt(mProgressBar,"progress",0,100);
    mAnimation.setDuration(time);
    mAnimation.setInterpolator(new DecelerateInterpolator());
    mAnimation.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationCancel(Animator animation) {
            super.onAnimationCancel(animation);
        }

        @Override
        public void onAnimationStart(Animator animator){

        }

        @Override
        public void onAnimationEnd (Animator animator){
        }
    });
    mAnimation.start();
    mCountDownTimer.start();


    this.activity=this;
    this.imi1=findViewById(R.id.imi1);
    this.imi2=findViewById(R.id.imi2);
    this.imi3=findViewById(R.id.imi3);
    this.imi4=findViewById(R.id.imi4);
    this.imi5=findViewById(R.id.imi5);
    this.imi6=findViewById(R.id.imi6);
    this.imi7=findViewById(R.id.imi7);
    this.imi8=findViewById(R.id.imi8);
    this.imi9=findViewById(R.id.imi9);
    this.point=findViewById(R.id.point);


    for(int i = 0; i<9 ; i++) {
        melange.add(i);}
    Collections.shuffle(melange);
    tab = melange.toArray(tab);

    imi1.setImageDrawable(getDrawable(boquette[tab[0]]));
    imi2.setImageDrawable(getDrawable(boquette[tab[1]]));
    imi3.setImageDrawable(getDrawable(boquette[tab[2]]));
    imi4.setImageDrawable(getDrawable(boquette[tab[3]]));
    imi5.setImageDrawable(getDrawable(boquette[tab[4]]));
    imi6.setImageDrawable(getDrawable(boquette[tab[5]]));
    imi7.setImageDrawable(getDrawable(boquette[tab[6]]));
    imi8.setImageDrawable(getDrawable(boquette[tab[7]]));
    imi9.setImageDrawable(getDrawable(boquette[tab[8]]));


    point.setText("Points = "+j);

    imi1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final CustomPopUp Custompopup =new CustomPopUp(activity);

            if (tab[0]==6) {
                Custompopup.setTextPopUp("T'as gagné !");
                Custompopup.setImPopUp(hyppieState[1]);
                mAnimation.cancel();
                mCountDownTimer.cancel();
                Custompopup.getButtonPopUp().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Collections.shuffle(melange);
                        tab = melange.toArray(tab);
                             imi1.setImageDrawable(getDrawable(boquette[tab[0]]));                           imi2.setImageDrawable(getDrawable(boquette[tab[1]]));                            imi3.setImageDrawable(getDrawable(boquette[tab[2]]));                           imi4.setImageDrawable(getDrawable(boquette[tab[3]]));                           imi5.setImageDrawable(getDrawable(boquette[tab[4]]));                          imi6.setImageDrawable(getDrawable(boquette[tab[5]]));                          imi7.setImageDrawable(getDrawable(boquette[tab[6]]));                          imi8.setImageDrawable(getDrawable(boquette[tab[7]]));                          imi9.setImageDrawable(getDrawable(boquette[tab[8]]));
                        j++;
                        point.setText("Points = "+j);
                        Toast.makeText(getApplicationContext(),"Bien joué",Toast.LENGTH_SHORT).show();
                        Custompopup.dismiss();
                        time=time-500;
                        mAnimation.setDuration(time);
                        mCountDownTimer=new CountDownTimer(time,10) {
                            @Override
                            public void onTick(long millisUntilFinished) {

                            }

                            @Override
                            public void onFinish() {
                                Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
                                startActivity(MainActivity);
                                Toast.makeText(getApplicationContext(),"Trop lent "+point.getText(),Toast.LENGTH_SHORT).show();
                                finish();

                            }
                        };
                        mAnimation.start();
                        mCountDownTimer.start();
                    }
                });
                Custompopup.build();
            }
            else {
                Custompopup.setTextPopUp("T'es mauvais Jack !");
                Custompopup.setImPopUp(hyppieState[0]);
                mCountDownTimer.cancel();
                Custompopup.getButtonPopUp().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(getApplicationContext(),"Perdu  "+point.getText(),Toast.LENGTH_SHORT).show();
                        Custompopup.dismiss();
                        Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
                        startActivity(MainActivity);
                        finish();
                    }
                });
                Custompopup.build();
            }
        }
    });
// Same code for imi2 to imi9

    final CustomPopUp Cust = new CustomPopUp(activity);

    if(j==123){
        Cust.setTextPopUp("PHY'S !");
        Cust.setImPopUp(hyppieState[0]);
        Cust.getButtonPopUp().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
                startActivity(MainActivity);
                finish();
            }
        });
        Cust.build();
    }

}
   }

最后是CustomPopUp类:

package com.example.taphypv123;

import android.app.Activity;
import android.app.Dialog;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomPopUp extends Dialog {

private TextView TextPopUp;
private ImageView ImPopUp;
private Button ButtonPopUp;
private String message;

public CustomPopUp (Activity activity){
    super(activity, R.style.Theme_AppCompat_DayNight_Dialog);
    setContentView(R.layout.popup);
    this.message="lolilol";
    this.TextPopUp=findViewById(R.id.TextPopUp);
    this.ImPopUp=findViewById(R.id.ImPopUp);
    this.ButtonPopUp=findViewById(R.id.ButtonPopUp);
}

public void setTextPopUp (String message){
    this.message=message;
}
public void setImPopUp (int imPop){
    ImPopUp.setImageResource(imPop);
}
public Button getButtonPopUp() {return ButtonPopUp;}

public void build(){
    show();
    TextPopUp.setText(message);
}
 }

MainActivity的布局是Constrain Layout,游戏的布局是Linear Layout,内部是GridView,CustomPopUp布局是LinearLayout 如果需要的话,我可以告诉你。

我添加了档位:

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.example.taphypv123"
    minSdkVersion 26
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
productFlavors {
}
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
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'
}

事实是,它可以与虚拟设备Nexus 5 API 28和Nexus 5 API 26完美配合。因此,我没有得到任何错误或logcat(alt +6则什么也不说)。 但是,当我生成APK文件时,它可以在装有Android 9.0的Xperia XZ2上完美运行,并且在我的朋友的手机上也可以正常运行。但是,当我将APK文件交给具有三星A8和Android 8.0的朋友时,该应用程序可以正确打开,但是当他在MainActivity屏幕上单击“播放”时,该应用程序会关闭,而不会出现任何错误消息,它只是说“应用程序停止工作,请重新打开?”。 另一个是我制作了第一个应用程序,即当您单击图像时计数器会增加,并且在Samsung A8上运行良好。 这就是为什么我不明白为什么它不起作用的原因,但也许是因为我使用了API28中的某些类而不是API26?

再次感谢:)

0 个答案:

没有答案