2017-02-01 3 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" />

НЕ ПОЛНОСТЬЮ связанный с этим вопрос, но это будет приподнятое, чтобы получить ответ Какова политика Google PlayStore на приложения, которые работают службы геолокации весь день? Так как я использую FusedLocationProvider API будет ли playstore отклонить мое приложение, потому что требует GPS, чтобы быть запущен весь день, будь то на переднем плане или на заднем плане или даже если приложение будет убит

ответ

0

Из журнала

Невозможно запустить активность java.lang.IllegalStateException: вам необходимо использовать тему Theme.AppCompat (или потомок) с этим действием.

попробовать Theme.AppCompat тему (или потомок)

также в этом сценарии избегает использования слитого места вместо того, чтобы использовать Местоположение Диспетчер

LocationManager менеджер = (LocationManager) getSystemService (Context.LOCATION_SERVICE);

manager.isProviderEnabled (LocationManager.GPS_PROVIDER);

+0

Почему вы предлагаете использовать LocationManager, каково преимущество перед FusedLocation. Раньше я использовал диспетчер местоположений и переключился на google play services 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

Это ничего не изменило. My 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> 

Для второго запроса я не думаю, что это создаст проблему для ур приложения в Google Play ..

но это лучшая практика, чтобы остановить все фоновые службы, когда приложение будет уничтожено

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

Использование Theme.AppCompat поражает мою цель для поддержания полупрозрачной темы :(Вот почему я хочу исправить код, чтобы включить alertDialog, чтобы показать whiles, игнорируя предложение logcat. Что касается моего второго запроса, спасибо за вход. на onDestroy, я должен отключить мое обслуживание? –

+0

вот хороший пример: http: //www.androidwarriors.com/2015/10/fused-location-provider-in-android.html – rafsanahmad007

+0

Hahahaha это точный урок I поскольку я впервые использовал API FusedLocationProvider !!! Он отличный, помог мне понять его лучше, чем документы google –

Смежные вопросы