Diskuze: [Android]Příklad AndroidGPSTracking

Ostatní jazyky Ostatní programovací jazyky [Android]Příklad AndroidGPSTracking

Aktivity (1)
Avatar
Vítězslav Škrabal:14. dubna 17:32

Pokouším se do příkladu který je u knihy "Programujeme pro Android" přidat funkci zápis do textového souboru který se pokouší ukládat na SD kartu ale nedaří se vždy se uloží na do interní paměti telefonu to jen mimochodem kdyby někdo věděl jak uložit textoví soubor na SD kartu to by byl pro mě bonus navíc.A teď co mě nedá spát ;-) na přiloženém zdrojáku buď mě chybí nebo přebývá nebo je na špatném místě buď ( nebo ) nebo {nebo } pomůže mi někdo odhalit kde dělám chybu? díky

package com.example.gpstracking;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.CheckBox;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class AndroidGPSTrackingActivity extends Activity {
    String souradnice;
    Button btnShowLocation;

    // Definice globální proměnné GPSTracker class
    GPSTracker gps;
    Calendar c = Calendar.getInstance();
   private CheckBox checkBox1;
   private CheckBox checkBox2;
   public static String soubor="lokace.txt";
   String s;
   double lat;
    double lon;
    String datum;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);
        checkBox1=(CheckBox)findViewById(R.id.checkBox1);
        checkBox2=(CheckBox)findViewById(R.id.checkBox2);
        // Přiřazení Click listeneru tlačítku pro zobrazení souřadnic

        btnShowLocation.setOnClickListener(new View.OnClickListener() {

            @Override
           /* public void save(View v){
               try{
                  OutputStream MyOutputStreams = openFileOutput(soubor,0);
                  OutputStreamWriter MyOutputStream = new OutputStreamWriter(MyOutputStreams);
                  MyOutputStream.write(s);
                  MyOutputStream.close();
                  //Log.d("save", "save");
                  Toast.makeText(this, "Zapis do souboru proběhl v pořádku",Toast.LENGTH_LONG).show();
               } catch (Exception e){
                  //e.printStackTrace();{
                  // Log.d("eror", "eror");
                  Toast.makeText(this, "Zapis do souboru se nepodařil",Toast.LENGTH_LONG).show();
               }

            }*/
            public void onClick(View arg0) {

                // Vytvoření instance třídy GPSTracker
                gps = new GPSTracker(AndroidGPSTrackingActivity.this);

                // Kontrola, zda je zapnuta GPS v zařízení
                if(gps.canGetLocation()){

                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();
             if (checkBox1.isChecked()){

                    SmsManager smsManager=SmsManager.getDefault();

                    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm");
                    String formattedDate = df.format(c.getTime());
                    String sms= "http://maps.google.com/maps?f=g&g="+Double.toString(lat)+","+Double.toString(lon)+"&z16";
                    //sms=sms+Double.toString(lon);
                    //public String f= formattedDate+"\n"+sms;
                    s=formattedDate+"\n"+sms+"\n";
                    smsManager.sendTextMessage("123456978", null, formattedDate+"\n"+sms, null, null);
                   datum=formattedDate;
              }
            if (checkBox2.isChecked()){
               if (isWriteable()){
                  write();
               }
            }


                    Toast.makeText(getApplicationContext(), "Gps souřadnice jsou - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                }else{
                    // Pokud nemůžeme získat souřadnice pomocí GPS
                    // nebo je získání souřadnic pomocí sítě vypnuto
                    // zobrazíme uživateli dialogové okno
                    gps.showSettingsAlert();
                }

            }




private void write()
{
   File sdCard= new File (Environment.getExternalStorageDirectory()+"/msoubory");
   if (!sdCard.exists()){
      sdCard.mkdir();
   }
   File f= new File(sdCard.getAbsolutePath(),"Lokace.txt");

   try
   {
      FileOutputStream fos = new FileOutputStream(f,true);
      String data = datum+"\n"+"http://maps.google.com/maps?f=g&g="+Double.toString(lat)+","+Double.toString(lon)+"&z16";
      try {

         fos.write(data.getBytes());
         fos.close();
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }catch (FileNotFoundException e){
      e.printStackTrace();
   }

}
private boolean isWriteable()
{
     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
     {
        return true;
     }else {
        return false;
     }
}}}}
 
Odpovědět 14. dubna 17:32
Avatar
Odpovídá na Vítězslav Škrabal
Vítězslav Škrabal:16. dubna 13:40

Ješťe se nikdo nenašel?díky

 
Nahoru Odpovědět 16. dubna 13:40
Avatar
Odpovídá na Vítězslav Škrabal
Matúš Olejník:16. dubna 15:02

V AndroidManifes­t.xml treba permission

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

.
.
.

File file;
//test či je vložená externá pamäťová karta
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
    file = new File(Environment.getExternalStorageDirectory() + File.separator + "nazovSuboru.pripona");
}
else {
    //ak nie je vložená karta zapíš súbor do internej pamäete
    file = new File(getFilesDir(), "nazovSuboru.pripona");
}

Takto by mala byť ozátvorkovaná metóda onCreate, ak máš potom stále nejaké chyby tak už len na konci poodmazávaj zátvorky. Ale takú chybu by si mal ľahko aj sám nájsť :)

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);
        checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
        checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
        // Přiřazení Click listeneru tlačítku pro zobrazení souřadnic

        btnShowLocation.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                // Vytvoření instance třídy GPSTracker
                gps = new GPSTracker(AndroidGPSTrackingActivity.this);

                // Kontrola, zda je zapnuta GPS v zařízení
                if (gps.canGetLocation()) {

                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();
                    if (checkBox1.isChecked()) {

                        SmsManager smsManager = SmsManager.getDefault();

                        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm");
                        String formattedDate = df.format(c.getTime());
                        String sms = "http://maps.google.com/maps?f=g&g=" + Double.toString(lat) + "," + Double
                            .toString(

                            lon) + "&z16";
                        //sms=sms+Double.toString(lon);
                        //public String f= formattedDate+"\n"+sms;
                        s = formattedDate + "\n" + sms + "\n";
                        smsManager.sendTextMessage("123456978", null, formattedDate + "\n" + sms, null, null);
                        datum = formattedDate;
                    }
                    if (checkBox2.isChecked()) {
                        if (isWriteable()) {
                            write();
                        }
                    }


                    Toast.makeText(
                        getApplicationContext(),
                        "Gps souřadnice jsou - \nLat: " + latitude + "\nLong: " + longitude,
                        Toast.LENGTH_LONG
                    ).show();
                } else {
                    // Pokud nemůžeme získat souřadnice pomocí GPS
                    // nebo je získání souřadnic pomocí sítě vypnuto
                    // zobrazíme uživateli dialogové okno
                    gps.showSettingsAlert();
                }
            }
        });
    }
Nahoru Odpovědět 16. dubna 15:02
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Vítězslav Škrabal:16. dubna 19:45

:-) velice děkuji za názorný příklad s těmi závorkami ale pořád se to nedaří ten soubor uložit na SD kartu pořád to ukládá do interní paměti tak jsem to upravil ale zřejmě špatně jak to upravit aby to fungovalo ? díky

private void write()
{
        File sdCard= new File (Environment.getExternalStorageDirectory()+File.separator+"/msoubory");
        if (!sdCard.exists()){
                sdCard.mkdir();
        }
        File f= new File(sdCard.getAbsolutePath()+File.separator,"Lokace.txt");

        try
        { .
          .
          .
 
Nahoru Odpovědět 16. dubna 19:45
Avatar
Odpovídá na Vítězslav Škrabal
Matúš Olejník:16. dubna 20:41

Môžeš si prečítať dokumentáciu https://developer.android.com/…e/files.html#… a použiť spôsob aký je uvedený v nej.

public File getPrivateStorageDir(Context context, String albumName) {
    // Get the directory for the app's private directory.
    File file = new File(context.getExternalFilesDir(null), "fileName");
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

Prípade skúsiť zadať priamo cestu

File file = new File("/sdcard/file.txt");

a daný súbor poslať do output streamu. Hlavne nezabudni dať do manifestu povolenie pre zápis na SD kartu

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Nahoru Odpovědět 16. dubna 20:41
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Vítězslav Škrabal:18. dubna 13:19

Na tom odkazu jsem byl už před tvým upozorněným ale vše marné dělám co mě napadne nebo co mi doporučíte ale ne a ne dosáhnout kýženého výsledku.Kdyby alespoň po připojení telefonu na PC byl ten soubor vidět ale ono ne, dostanu se do něho jen aplikace v telefonu Total Commander díky

 
Nahoru Odpovědět 18. dubna 13:19
Avatar
Odpovídá na Vítězslav Škrabal
Matúš Olejník:22. dubna 21:57

Tak trocha som Googlil a naozaj Environment.ge­tExternalStora­geDirectory() nemusí nutne vrátiť cestu k SD karte, viz. dokumentáciu

Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.

Preto môžeš použiť getExternalFi­lesDirs(null))

Returns absolute paths to application-specific directories on all shared/external storage devices where the application can place persistent files it owns. These files are internal to the application, and not typically visible to the user as media.

a teda väčšinou druhý priečinok by mal byť ten na SD karte. Súbor potom nájdeš v sdkarta/Andro­id/data/packa­geName/tvojSu­bor

private void writeFileToSdCard() {
    String testData = "teeeeeeeeeeeeeeest";
    FileOutputStream fos = null;
    try {
        File file = null;
        File[] storages = getExternalFilesDirs(null);
        if(storages.length > 1 && Objects.equals(
            Environment.getExternalStorageState(storages[1]),
            Environment.MEDIA_MOUNTED)
        ) {
            file = new File(storages[1], "testFile.txt");
        }
        if (file != null) {
            fos = new FileOutputStream(file, true);
            fos.write(testData.getBytes());
            fos.close();
        }
    } catch (FileNotFoundException e) {
          e.printStackTrace();
    } catch (IOException e) {
          e.printStackTrace();
    }
}
Nahoru Odpovědět 22. dubna 21:57
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Vítězslav Škrabal:24. dubna 11:50

Ale ta funkce ** getExternalFi­lesDirs(null)) je dostupná ve vyšších API ale já mám androidmanifestu nastavenou API 8 :-O díky

 
Nahoru Odpovědět 24. dubna 11:50
Avatar
Odpovídá na Vítězslav Škrabal
Matúš Olejník:24. dubna 12:09

Veď už je API 27 nechceš zvážiť zvýšiť to z 8?

Nahoru Odpovědět 24. dubna 12:09
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Vítězslav Škrabal:24. dubna 13:00

No o to mi právě jde jestli to bude fungovat v telefonu s Androidem 4.4.2 ?.A další věc napadlo mě ještě zkusit tu apku nainstalovat do telefonu IGET star P350 který mám jako relikvii zdálnověku :-) kde je android 2.3.5 a tam to vytvoří na SD kartě textový soubor který je i dostupný i PC po připojení pomocí USB . Ještě mě zaráží jedna věc ten vyexpedovaný soubor apk má cca velikost 800 k ale ten co ho upravuji AndroidGPSTracking aby mě ukládal souřadnice do textového souboru má jen 19 k .Asi tak mě ta apka fungovala to znamená zapisovala do textového souboru do interní paměti telefonu (Aligator s4060 duo )bez viditelnosti na PC tak jsem to upravoval a upravoval až to nevytváří nic bohužel jsem si po každé úpravě neověřil velikost výsledného souboru apk :-(

 
Nahoru Odpovědět 24. dubna 13:00
Avatar
Odpovídá na Vítězslav Škrabal
Matúš Olejník:24. dubna 13:10

Veď treba čítať tú dokumentáciu :) getExternalFi­lesDirs) - added in API level 19, Android 4.4 APIs - API Level: 19, takže áno bude to fungovať.

Pre také prípady odporúčam všetko si verziovať a budeš mať prehľad o všetkom čo si v danom projekte menil - odporúčam Git a dokonca tu o tom nájdeš aj článok :) https://www.itnetwork.cz/software/git

Nahoru Odpovědět 24. dubna 13:10
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.