2017-09-02 60 views
0

我的Android应用程序出现问题。 我使用Google服务和Admob在Libgdx中创建了一个应用程序。 如果我将debuggable设置为false,则应用程序只显示黑屏和手机上的广告(Android 6.0.1)...但是,如果将可调试设置为true,则它可以正常工作。 我测试了1个其他手机(Android 7.0)和模拟器,它都很好。Libgdx Android Blackscreen on Debuggable false

EDIT2:OK再次测试:使用Android工作室

我试图卸载该应用程序/重启手机IM:它只能在模拟器 顺便说一下工作。

编辑:

这里是我的代码:

的build.gradle(机器人):

android { 
signingConfigs { 
    config { 
     keyAlias '*****' 
     keyPassword '*****' 
     storeFile file('******') 
     storePassword '******' 
    } 
} 
buildToolsVersion '26.0.1' 
compileSdkVersion 26 
sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     aidl.srcDirs = ['src'] 
     renderscript.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
     assets.srcDirs = ['assets'] 
     jniLibs.srcDirs = ['libs'] 
    } 

    instrumentTest.setRoot('tests') 
} 
packagingOptions { 
    exclude 'META-INF/robovm/ios/robovm.xml' 
} 
defaultConfig { 
    applicationId "*****" 
    minSdkVersion 14 
    targetSdkVersion 26 
    versionCode 1 
    versionName "1.0" 
    signingConfig signingConfigs.config 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     debuggable false 
     signingConfig signingConfigs.config 
    } 
} 
productFlavors { 
} 
} 
task copyAndroidNatives() { 
file("libs/armeabi/").mkdirs(); 
file("libs/armeabi-v7a/").mkdirs(); 
file("libs/arm64-v8a/").mkdirs(); 
file("libs/x86_64/").mkdirs(); 
file("libs/x86/").mkdirs(); 

configurations.natives.files.each { jar -> 
    def outputDir = null 
    if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a") 
    if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")   
    if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") 
    if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64") 
    if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") 
    if(outputDir != null) { 
     copy { 
      from zipTree(jar) 
      into outputDir 
      include "*.so" 
     } 
    } 
} 
} 

task run(type: Exec) { 
def path 
def localProperties = project.file("../local.properties") 
if (localProperties.exists()) { 
    Properties properties = new Properties() 
    localProperties.withInputStream { instr -> 
     properties.load(instr) 
    } 
    def sdkDir = properties.getProperty('sdk.dir') 
    if (sdkDir) { 
     path = sdkDir 
    } else { 
     path = "$System.env.ANDROID_HOME" 
    } 
} else { 
    path = "$System.env.ANDROID_HOME" 
} 

def adb = path + "/platform-tools/adb" 
commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.*******/AndroidLauncher' 
} 

// sets up the Android Eclipse project, using the old Ant based build. 
eclipse { 
// need to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin 
// ignores any nodes added in classpath.file.withXml 
sourceSets { 
    main { 
     java.srcDirs "src", 'gen' 
    } 
} 

jdt { 
    sourceCompatibility = 1.6 
    targetCompatibility = 1.6 
} 

classpath { 
    plusConfigurations += [ project.configurations.compile ]   
    containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'  
} 

project { 
    name = appName + "-android" 
    natures 'com.android.ide.eclipse.adt.AndroidNature' 
    buildCommands.clear(); 
    buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder" 
    buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder" 
    buildCommand "org.eclipse.jdt.core.javabuilder" 
    buildCommand "com.android.ide.eclipse.adt.ApkBuilder" 
} 
} 

// sets up the Android Idea project, using the old Ant based build. 
idea { 
module { 
    sourceDirs += file("src"); 
    scopes = [ COMPILE: [plus:[project.configurations.compile]]]   

    iml { 
     withXml { 
      def node = it.asNode() 
      def builder = NodeBuilder.newInstance(); 
      builder.current = node; 
      builder.component(name: "FacetManager") { 
       facet(type: "android", name: "Android") { 
        configuration { 
         option(name: "UPDATE_PROPERTY_FILES", value:"true") 
        } 
       } 
      } 
     } 
    } 
} 
} 
dependencies { 
compile project(':core') 
compile project(':BaseGameUtils') 
} 

的build.gradle(BaseGameUtils):

apply plugin: 'com.android.library' 

buildscript { 
repositories { 
    jcenter() 
} 

dependencies { 
    classpath 'com.android.tools.build:gradle:2.3.3' 
} 
} 

dependencies { 
// Set defaults so that BaseGameUtils can be used outside of BasicSamples 
if (!project.hasProperty('appcompat_library_version')) { 
    ext.appcompat_library_version = '25.3.+' 
} 
if (!project.hasProperty('support_library_version')) { 
    ext.support_library_version = '25.3.+' 
} 
if (!project.hasProperty('gms_library_version')) { 
    ext.gms_library_version = '11.0.4' 
} 

compile "com.android.support:appcompat-v7:${appcompat_library_version}" 
compile "com.android.support:support-v4:${support_library_version}" 
compile "com.google.android.gms:play-services-games:${gms_library_version}" 
compile "com.google.android.gms:play-services-plus:${gms_library_version}" 
} 

android { 
// Set defaults so that BaseGameUtils can be used outside of BasicSamples 
if (!project.hasProperty('android_compile_version')) { 
    ext.android_compile_version = 25 
} 
if (!project.hasProperty('android_version')) { 
    ext.build_tools_version = "25.0.2" 
} 
// Set defaults so that BaseGameUtils can be used outside of BasicSamples 
if (!project.hasProperty('android_min_sdk_version')) { 
    // Google Play Services minimum requirements is 14 
    ext.android_min_sdk_version = 14 
} 

compileSdkVersion android_compile_version 
buildToolsVersion "25.0.2" 

defaultConfig { 
    minSdkVersion android_min_sdk_version 
    targetSdkVersion android_compile_version 
} 
} 

AndroidLauncher:

package com.*****; 

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.RelativeLayout; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.backends.android.AndroidApplication; 
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; 
import com.google.android.gms.ads.AdListener; 
import com.google.android.gms.ads.AdRequest; 
import com.google.android.gms.ads.AdSize; 
import com.google.android.gms.ads.AdView; 
import com.google.android.gms.ads.InterstitialAd; 
import com.google.android.gms.ads.MobileAds; 
import com.google.android.gms.ads.reward.RewardItem; 
import com.google.android.gms.ads.reward.RewardedVideoAd; 
import com.google.android.gms.ads.reward.RewardedVideoAdListener; 
import com.google.android.gms.games.Games; 
import com.google.example.games.basegameutils.GameHelper; 
import com.*****.R; 

public class AndroidLauncher extends AndroidApplication implements AdHandler,PlayServices { 

@Override 
protected void onPause() { 
    super.onPause(); 
    rewardedAd.pause(this); 
    adView.pause(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    adView.resume(); 
    rewardedAd.resume(this); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    adView.destroy(); 
    rewardedAd.destroy(this); 
    log("destroy", "android"); 
} 

//Play Service 
private GameHelper gameHelper; 
private final static int requestCode = 1; 

//AD'S 
private static final String TAG = "AndroidLauncher"; 
private final int SHOW_ADS = 1; 
private final int HIDE_ADS = 0; 
private final int SHOW_BIG_ADS = 3; 
private final int HIDE_BIG_ADS = 2; 
private final int SHOW_REWARD_ADS = 5; 
private final int HIDE_REWARD_ADS = 4; 
protected AdView adView; 
protected InterstitialAd interstitialAd; 
private boolean interstitialLoaded = false; 
protected RewardedVideoAd rewardedAd; 

private String rewardType; 
private int beforeReward; 

private boolean rewardedIsLoaded = false; 

Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case SHOW_ADS: 
       adView.setVisibility(View.VISIBLE); 
       break; 
      case HIDE_ADS: 
       adView.setVisibility(View.GONE); 
       break; 
      case SHOW_BIG_ADS: 
       if (interstitialLoaded) { 
        interstitialAd.show(); 
       } 
       break; 
      case HIDE_BIG_ADS: 
       break; 
      case SHOW_REWARD_ADS: 
       if (rewardedAd.isLoaded()) { 
        rewardedAd.show(); 
       } else { 
        loadRewardedVideoAd(); 
       } 
       break; 

     } 
    } 
}; 

@Override 
public boolean rewardIsLoaded() { 
    return rewardedIsLoaded; 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Play Services 

    gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES); 
    gameHelper.enableDebugLog(false); 

    GameHelper.GameHelperListener gameHelperListener = new GameHelper.GameHelperListener() 
    { 
     @Override 
     public void onSignInFailed(){ } 

     @Override 
     public void onSignInSucceeded(){ } 
    }; 

    //AD'S 

    MobileAds.initialize(this, "*******"); 

    rewardedAd = MobileAds.getRewardedVideoAdInstance(this); 
    rewardedAd.setRewardedVideoAdListener(new RewardedVideoAdListener() { 
     @Override 
     public void onRewardedVideoAdLoaded() { 
      rewardedIsLoaded = true; 
     } 

     @Override 
     public void onRewardedVideoAdOpened() { 

     } 

     @Override 
     public void onRewardedVideoStarted() { 
      rewardedIsLoaded = false; 
     } 

     @Override 
     public void onRewardedVideoAdClosed() { 
      loadRewardedVideoAd(); 
     } 

     @Override 
     public void onRewarded(RewardItem rewardItem) { } 

     @Override 
     public void onRewardedVideoAdLeftApplication() { 

     } 

     @Override 
     public void onRewardedVideoAdFailedToLoad(int i) { 
      rewardedIsLoaded = false; 
      loadRewardedVideoAd(); 
     } 
    }); 
    loadRewardedVideoAd(); 

    interstitialAd = new InterstitialAd(this); 
    interstitialAd.setAdUnitId("********"); 
    final AdRequest adRequest = new AdRequest.Builder().addTestDevice("********") 
      .build(); 
    interstitialAd.loadAd(adRequest); 

    interstitialAd.setAdListener(new AdListener() { 
     @Override 
     public void onAdLoaded() { 
      super.onAdLoaded(); 
      interstitialLoaded = true; 
     } 

     @Override 
     public void onAdClosed() { 
      super.onAdClosed(); 
      interstitialLoaded = false; 
      interstitialAd.loadAd(adRequest); 
     } 
    }); 


    RelativeLayout layout = new RelativeLayout(this); 
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
    View gameView = initializeForView(new com.marcol.colorion.Gaming(this,this), config); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 


    adView = new AdView(this); 
    adView.setAdListener(new AdListener() { 
     @Override 
     public void onAdLoaded() { 
      super.onAdLoaded(); 
     } 
    }); 
    adView.setAdSize(AdSize.SMART_BANNER); 
    adView.setAdUnitId("*********"); 

    AdRequest.Builder builder = new AdRequest.Builder(); 

    builder.addTestDevice("*********"); 

    RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.MATCH_PARENT, 
      RelativeLayout.LayoutParams.WRAP_CONTENT 
    ); 

    RelativeLayout.LayoutParams gameParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    gameParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 

    log("add", "GameView"); 
    layout.addView(gameView, gameParams); 

    layout.addView(adView, adParams); 
    adView.loadAd(builder.build()); 
    setContentView(layout); 


    //initialize(new Gaming(), config); 
    gameHelper.setup(gameHelperListener); 
} 

private void loadRewardedVideoAd() { 
    rewardedAd.loadAd("**********", new AdRequest.Builder() 
      .addTestDevice("*************").build()); 
} 

@Override 
public void showAds(boolean show) { 
    handler.sendEmptyMessage(show ? SHOW_ADS : HIDE_ADS); 
} 

@Override 
public void showBigAd(boolean show) { 
    handler.sendEmptyMessage(show ? SHOW_BIG_ADS : HIDE_BIG_ADS); 
} 

@Override 
public void showRewardAd(boolean show, String rewardType, int beforeReward) { 
    this.rewardType = rewardType; 
    this.beforeReward = beforeReward; 
    handler.sendEmptyMessage(show ? SHOW_REWARD_ADS : HIDE_REWARD_ADS); 
} 

//Play Services 
@Override 
protected void onStart() { 
    super.onStart(); 
    gameHelper.onStart(this); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    gameHelper.onStop(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    gameHelper.onActivityResult(requestCode, resultCode, data); 
} 


@Override 
public void signIn() { 
    try { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       gameHelper.beginUserInitiatedSignIn(); 
      } 
     }); 
    } catch (Exception e) { 
     Gdx.app.log("MainActivity", "Log in failed: " + e.getMessage() + "."); 
    } 
} 

@Override 
public void signOut() { 
    try { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       gameHelper.signOut(); 
      } 
     }); 
    } catch (Exception e) { 
     Gdx.app.log("MainActivity", "Log out failed: " + e.getMessage() + "."); 
    } 
} 

@Override 
public void rateGame() { 
    String str = "Your PlayStore Link"; 
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(str))); 
} 

@Override 
public void unlockAchievement() { 
    /* Games.Achievements.unlock(gameHelper.getApiClient(), 
      getString(R.string.achievement_dum_dum));*/ 
} 

@Override 
public void submitScore(int highScore) { 
    if (isSignedIn() == true) { 
     Games.Leaderboards.submitScore(gameHelper.getApiClient(), 
       getString(R.string.leaderboard_highscores), highScore); 
    } 
} 

@Override 
public void showAchievement() { 
    if (isSignedIn() == true) { 
     startActivityForResult(Games.Achievements.getAchievementsIntent(gameHelper.getApiClient()), requestCode); 
    } else { 
     signIn(); 
    } 
} 

@Override 
public void showScore() { 
    if (isSignedIn() == true) { 
     startActivityForResult(Games.Leaderboards.getLeaderboardIntent(gameHelper.getApiClient(), 
       getString(R.string.leaderboard_highscores)), requestCode); 
    } else { 
     signIn(); 
    } 
} 

@Override 
public boolean isSignedIn() { 
    return gameHelper.isSignedIn(); 
} 
} 

我希望任何1能帮助我。

谢谢:) Discor

+1

请创建一个新项目,重现您所问的问题。请参阅[mcve]以获取发布代码示例的建议。 –

回答

0

确定我固定它:

,一定不要调用在主线程一个HTTP请求:d

“在Android设备上:不能在主线程访问网络而不禁用严格模式,这样做是为了防止网络操作挂起主线程,参见这里“,

https://github.com/libgdx/libgdx/wiki/Networking