2017-02-01 173 views
0

所以我有一个服务,我试图显示一个警告对话框。这似乎是不可能的,所以我决定在我的应用程序的半透明活动中展示它。不过,我收到此错误:在半透明的活动中显示警告对话框

02-01 10:29:18.336 3806-3806/? E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: com.application.sweetiean.dummylocationupdates, PID: 3806 
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.application.sweetiean.dummylocationupdates/com.application.sweetiean.dummylocationupdates.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 
               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
               at android.app.ActivityThread.access$800(ActivityThread.java:144) 
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
               at android.os.Handler.dispatchMessage(Handler.java:102) 
               at android.os.Looper.loop(Looper.java:135) 
               at android.app.ActivityThread.main(ActivityThread.java:5221) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:372) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
               Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 
               at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:355) 
               at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:324) 
               at android.support.v7.app.AppCompatDelegateImplV9.onPostCreate(AppCompatDelegateImplV9.java:172) 
               at android.support.v7.app.AppCompatActivity.onPostCreate(AppCompatActivity.java:101) 
               at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1186) 
               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2280) 
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)  
               at android.app.ActivityThread.access$800(ActivityThread.java:144)  
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)  
               at android.os.Handler.dispatchMessage(Handler.java:102)  
               at android.os.Looper.loop(Looper.java:135)  
               at android.app.ActivityThread.main(ActivityThread.java:5221)  
               at java.lang.reflect.Method.invoke(Native Method)  
               at java.lang.reflect.Method.invoke(Method.java:372)  
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)  
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  

这是我的主要活动类:

package com.application.sweetiean.dummylocationupdates; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.LocationManager; 
import android.provider.Settings; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.view.ContextThemeWrapper; 
import android.view.WindowManager; 
import android.widget.Toast; 

import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationServices; 

import static com.application.sweetiean.dummylocationupdates.R.style.dialog; 

public class MainActivity extends AppCompatActivity { 
    LocationManager locationManager; 

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

    Toast.makeText(this, "Background Services starting...", Toast.LENGTH_SHORT).show(); 
    // use this to start and trigger a service 
    Intent i= new Intent(this, LocationUpdateService.class); 
    /*this.startService(i); 
    finish();*/ 

    // potentially add data to the intent 
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

    // check if enabled and if not send user to the GSP settings 
    if (!enabled) { 
     showSettingsAlert(); 
    } else { 
     this.startService(i); 
     finish(); 
    } 
    //finish(); 
} 

public void showSettingsAlert() { 
    //AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(getApplication(), dialog)); 
    builder.setTitle("GPS Settings"); 
    builder.setMessage("GPS is not enabled. Do you want to enable it?"); 
    //AlertDialog alert = builder.create(); 

    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(intent); 
     } 
    }); 

    builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
      //stopSelf(); 
     } 
    }); 

    AlertDialog alert = builder.create(); 

    alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 

    alert.show(); 

} 

}

我现在用的是融合位置提供API在我的服务,我要确保用户在服务运行之前打开GPS。 我有这个在我的清单已经:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

不完全相关的问题但它会心花怒放得到答案 什么是谷歌Play商店中的在运行位置服务整天应用的政策?由于我使用的是FusedLocationProvider API将在Play商店中拒绝我的应用程序,因为需要GPS为全日运行无论是在前台或后台或者,即使应用程序被杀害

回答

0

从日志

无法启动活动java.lang.IllegalStateException:您需要为此活动使用Theme.AppCompat主题(或后代)。

尝试Theme.AppCompat主题(或后代)

也是在这种情况下忌用融合的位置,而不是使用定位管理

的LocationManager经理=(的LocationManager)getSystemService(Context.LOCATION_SERVICE);

manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

+0

为什么你会建议我使用LocationManager,与FusedLocation相比有什么优势。我以前使用位置管理器,并切换到谷歌播放服务api。另外,我可以使用具有半透明活动的appcompat主题吗?我只是开始得到这个错误,当我决定引入alertdialog –

1

做这样的:

AlertDialog.Builder builder = new AlertDialog.Builder(
      MainActivity.this); 
    builder.setTitle("GPS Settings"); 
    builder.setMessage("GPS is not enabled. Do you want to enable it?"); 
    AlertDialog alertDialog = builder.create(); 
    alertDialog.show(); 
+0

我仍然得到相同的logcat错误与此。请求我使用AppCompat主题 –

+0

@SweetieAnang尝试更新的答案。让我知道这是否有效 –

+0

它没有改变任何东西。我的MainActivity是一个半透明的活动 –

1

对于第一exception试试这个:

styles.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Theme.Transparent" parent="@style/Theme.AppCompat"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
    </style> 

以此作为创建这一主题:

<activity android:name=".MainActivity" android:theme="@style/Theme.Transparent"> 
</activity> 

对于第二个查询我不认为这会为UR谷歌应用程序中发挥的问题..

,但它是最好的做法,停止所有后台服务时,应用程序被破坏

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mGoogleApiClient.disconnect(); 
} 
+0

使用Theme.AppCompat击败了我维护半透明主题的目的:(这就是为什么我想修复代码以使alertDialog能够显示而忽略l​​ogcat建议。至于我的第二个查询,感谢您的输入。关于onDestroy,我应该断开我的服务吧? –

+0

这里是一个很好的例子:http://www.androidwarriors.com/2015/10/fused-location-provider-in-android.html – rafsanahmad007

+0

Hahahaha这是确切的教程I使用,因为它是我第一次使用FusedLocationProvider API !!!这是一个伟大的,帮助我更好地理解它比谷歌文档更好 –