Использование вкладок, Wi-Fi и GPS - PullRequest
0 голосов
/ 28 апреля 2011

Am Генерируя 3 вкладки динамически, под 1-й вкладкой я генерирую тумблер, с помощью которого я могу выключить и включить GPS и WIFI
Я закодировал файлы Java для GPS и WIFI. Я проверял снова и снова построчно, но не смог найти ошибку. Я запустил в эмуляторе и Android "Sony Arc Mobile также." Установка также идет хорошо, и проблема возникает, когда я пытаюсь запустить. Приложение отображает сообщение " Приложение неожиданно остановлено, пожалуйста, попробуйте еще раз " Я отправил почти { все } все запросы в переполнении стека и не смог получить какой-либо возможный ответ для мой сценарий .. Я попытался удалить файлы GPS и WIFI в приложении и заменить Toggle Button на TextView , тогда он работает нормально.
Включаю мой код, пожалуйста, проверьте его и помогите мне с друзьями.

Main.java

пакет project.sow;
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
импорт android.os.Bundle;
import android.widget.TabHost;
открытый класс Main extends TabActivity {
приватный TabHost tabHost;
@ Override
public void onCreate (Bundle saveInstanceState) {
попробуйте {
super.onCreate (savedInstanceState);
setContentView (R.layout.main); * 1 031 * Ресурсы res = getResources (); // Ресурсный объект для получения Drawables
tabHost = (TabHost) findViewById (android.R.id.tabhost); // Деятельность TabHost
TabHost.TabSpec spec; // Возможность повторного использования TabSpec для каждой вкладки
// Инициализируем TabSpec для каждой вкладки и добавляем его в TabHost
spec = tabHost.newTabSpec («Пуск»). setIndicator («Пуск», res.getDrawable (R.drawable.ic_sample));
spec.setContent (new Intent (this, Start.class));
tabHost.addTab (спецификация); * * тысяча тридцать-восемь spec = tabHost.newTabSpec ("Info"). setIndicator ("Info", res.getDrawable (R.drawable.ic_sample));
spec.setContent (new Intent (). setClass (this, Info.class));
tabHost.addTab (спецификация);

   spec = tabHost.newTabSpec("Update").setIndicator("Update",   res.getDrawable(R.drawable.ic_sample));             
    spec.setContent(new Intent(this, Update.class));  
    tabHost.addTab(spec);  

    tabHost.setCurrentTab(1);  
}catch(Exception e)  
{
    android.util.Log.i("PREFS",e.getMessage());  
} } }     

Start.java

пакет project.sow;
импорт android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.net.wifi.WifiManager;
импорт android.os.Bundle;
import android.widget.TextView;
импорт android.widget.Toast;
import android.widget.ToggleButton;
Открытый класс Начало расширяет Деятельность {
общедоступный WifiManager wifi;
логический статус;
Контекстный контекст;
public TextView textStatus;
общедоступный LocationManager locationManager;
public LocationListener locationListener;
общедоступный приемник BroadcastReceiver;
публичный LocationProvider locationProvider;

public void onCreate(Bundle savedInstanceState) {  
        try{   
        super.onCreate(savedInstanceState);           
        TextView textview = new TextView(this);  
        textview.setText("Toggle to On r Off the Application");  
        setContentView(textview);  
        ToggleButton btnonoff = new ToggleButton(this);  
        setContentView(btnonoff);  
        if(btnonoff.isChecked()){  
           status=true;  
            wifi.setWifiEnabled(true);  
            try{  
            // Setup WiFi  
            wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
            locationManager = (LocationManager)   getSystemService(Context.LOCATION_SERVICE);  
            if (receiver == null)  
                receiver = new WiFiFilter(this);                
            registerReceiver(receiver, new IntentFilter(  
            WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));  
            if (locationListener ==null ){locationListener=new gpsLocation(this);} 
            }  
            catch(Exception e){Toast.makeText(context, WIFI_SERVICE, Toast.LENGTH_LONG).show();}  
       }   
       else if(!btnonoff.isChecked()) {  
          status=false;    
           if(wifi.isWifiEnabled()){  
           wifi.setWifiEnabled(false);  
           locationManager.removeUpdates((LocationListener) this);  
           }  
            }               
        }  
        catch(Exception e)  
        {  
            android.util.Log.i("PREFS",e.getMessage());  
        }  
}     }  

WifiFilter.java

пакет project.sow;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.util.Log;
импорт android.widget.Toast;
Открытый класс WiFiFilter расширяет BroadcastReceiver {
private static final String TAG = "WiFiFilter";
Старт старт;
public WiFiFilter (стартовый запуск) {
супер ();
this.start = старт;
}
// Подготовка к скрытому SSID и сохранение конфигурации Wi-Fi для последующего использования
@ Override
public void onReceive (контекст c, намерение намерения) {
Список результатов = start.wifi.getScanResults ();
Список результатов2 = ноль;
ScanResult filter = null;
// фильтрация SSID
для (ScanResult filterresult: результаты) {
если (filterresult.SSID == "VOLSBB")
{
результаты2 = результаты;}
}
// Проверка уровня сигнала
для (ScanResult result: results2) {
if (filter == null
|| WifiManager.compareSignalLevel (filter.level, result.level) <0) <br> фильтр = результат;
попробуйте {
WifiManager.ACTION_PICK_WIFI_NETWORK.equals (фильтр); * * 1 118 }
catch (Exception e) {String res = "Exception: No network"; Toast.makeText (start, res, Toast.LENGTH_LONG) .show ();};
}
String message = String.format («Подключено к S0W»);
if (filter.SSID! = null) {
//Toast.makeText(start, message, Toast.LENGTH_LONG) .show ();
Log.d (TAG, "onReceive () message:" + message);
}
}}

gpsLocation.java

пакет project.sow;
import project.sow.CustomWebView;
импорт android.location.Criteria;
import android.location.GpsStatus;
импорт android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
импорт android.os.Bundle;
import project.sow.Start;
открытый класс gpsLocation реализует LocationListener {
Запустите sowWifigps;
public Location currentBestLocation;
Публичное расположение Местоположение;
Состояние GpsStatus;
CustomWebView webviewgps;
двойной а;
двойной b;
@SuppressWarnings ( "неиспользованный")
приватный String bestProvider;
// public LocationManager locationManager;
public String provider1;
public gpsLocation (Запустить sowWifigps) {
супер ();
this.sowWifigps = sowWifigps;
// TODO автоматически сгенерированная заглушка конструктора
Критерии критериев = новые критерии ();
// bestProvider = sowWifigps.locationManager.getBestProvider (критерии, ложь);
попробуйте {
если (LocationManager.GPS_PROVIDER == NULL) {
provider1 = LocationManager.NETWORK_PROVIDER;
}
else {provider1 = LocationManager.GPS_PROVIDER;}
} catch (Exception e) {provider1 = sowWifigps.locationManager.getBestProvider (критерии, ложь);}
}
@ Override
public void onLocationChanged (Location location) {
// TODO Автоматически сгенерированный метод заглушки
sowWifigps.locationManager.requestLocationUpdates (provider1, 12000, 200, sowWifigps.locationListener);
}
@ Override
public void onProviderDisabled (поставщик строк) {
// TODO Автоматически сгенерированный метод заглушки
// provider = LocationManager.NETWORK_PROVIDER;
currentBestLocation = sowWifigps.locationManager.getLastKnownLocation (Provider1);
а = currentBestLocation.getLatitude ();
б = currentBestLocation.getLongitude ();
webviewgps.loadUrl ("http://localhost/mobile/default_mobile.php?lat="+a+"&long="+b); // изменить имя сайта
}
@ Override
public void onProviderEnabled (поставщик строк) {
// TODO автоматически сгенерированный метод заглушки
sowWifigps.locationManager.requestLocationUpdates (provider1, 12000, 200, sowWifigps.locationListener);
a = currentBestLocation.getLatitude ();
b = currentBestLocation.getLongitude ();
webviewgps.loadUrl ("http://localhost/mobile/default_mobile.php?lat="+a+"&long="+b); // изменить имя сайта
}
@ Override
public void onStatusChanged (поставщик строк, состояние int, дополнительные функции пакета) {
// Заглушка автоматически сгенерированного метода TODO
sowWifigps.locationListener.onLocationChanged (location);
}
}

Представляю здесь вторую вкладку и другую, похожую на эту. Так что опускаю ее.


Info.java

package project.sow;
import android.app.Activity;
import android.os.Bundle;
открытый класс Информация расширяет Activity {
public void onCreate (Bundle saveInstanceState) {
super.onCreate (saveInstanceState);
} ​​
@ Переопределить
protected void onResume () {
CustomWebView webView = new CustomWebView (this);
webView.loadUrl ("http://www.google.com/?s=Info");
setContentView (webView);
super.onResume ();
}}



CustomWebView.java
пакет project.sow;
import android.app.ProgressDialog;
импорт android.content.Context;
импорт android.graphics.Bitmap;
импорт android.view.View;
импорт android.webkit.WebView;
импорт android.webkit.WebViewClient;
открытый класс CustomWebViewрасширяет WebView {
private ProgressDialog pgBar = null;
@SuppressWarnings ("unused")
приватный контекст ctx;
публичный CustomWebView (контекстный контекст) {
super (context);
this.clearCache (true);
this.clearFormData ();
this.clearHistory ();
this.getSettings (). setJavaScriptEnabled (true);
this.getSettings (). setUserAgentString (null);
this.requestFocus (View.FOCUS_DOWN);
this.setWebViewClient (new CustomWebView.CustomWebViewClient ());
this.pgBar = new ProgressDialog (context);
this.pgBar.setMessage ("Загрузка ...");
ctx = context;
}
закрытый класс CustomWebViewClient расширяет WebViewClient {
@ Override
public void onPageStarted (представление WebView, строковый URL, значок растрового изображения) {
super.onPageStarted (view, url, favicon);
if (! CustomWebView.this.pgBar.isShowing ()) {
CustomWebView.this.pgBar.show ();
}
}
@ Override
public void onPageFinished (представление WebView, URL-адрес строки) {
super.onPageFinished (view, url);
if (CustomWebView.this.pgBar.isShowing ()) {
CustomWebView.this.pgBar.dismiss ();
}
}
@Переопределить
public boolean shouldOverrideUrlLoading (представление WebView, URL-адрес строки) {
try {
view.loadUrl (url);
} catch (Exception ex) {
}
return true;
}}}

main.XML

<?xml version="1.0" encoding="utf-8"?>  
<TabHost android:layout_width="fill_parent"  
    android:layout_height="fill_parent" xmlns:android="http://schemas.android.com  /apk/res/android" android:id="@android:id/tabhost" android:background="#cabfa9">  
    <LinearLayout android:id="@+id/LinearLayout01"  
        android:orientation="vertical" android:layout_height="fill_parent"  
        android:layout_width="fill_parent">  
<TabWidget android:id="@android:id/tabs" android:layout_height="wrap_content"   android:layout_width="fill_parent"   android:background="#1b3b5b" ></TabWidget>  
        <FrameLayout android:id="@android:id/tabcontent"   android:layout_height="fill_parent" android:layout_width="fill_parent"   android:scrollbars="horizontal" android:background="#cabfa9">           
    </FrameLayout>  
    </LinearLayout>  
</TabHost>

style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="tabText" parent="@android:style/Theme.Black">        
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:textSize">10dip</item>        
    </style>    

</resources>

`

ic_sample

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/icon1"
          android:state_selected="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/icon2" />
</selector>

Я добавил следующие разрешения в файл манифеста

<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

1 Ответ

0 голосов
/ 29 апреля 2011

WI-FI и GPS должны вызываться в основных потоках, а не в дочерних.
Так в main.java,

try{  
   // Setup WiFi  
   wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
   locationManager = (LocationManager)   getSystemService(Context.LOCATION_SERVICE);  
   if (receiver == null)  
       receiver = new WiFiFilter(this);                
   registerReceiver(receiver, new IntentFilter(  
                  WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));  
   if (locationListener ==null ){
       locationListener=new gpsLocation(this);
       } 
   }  
   catch(Exception e){
       Toast.makeText(context, WIFI_SERVICE, Toast.LENGTH_LONG).show();
   }  
}     

Должны быть размещены, которые ранее назывались инициализированными в start.java

При этом процессы не уничтожаются, что важно и предотвращает сбой приложения.

...