JAVA ANDROID 08 (p) - upload, sharing, SharedPreferences

JAVA ANDROID 08 (p) - upload, sharing, SharedPreferences
ukryj menu
SPEC
aktualizacja: 2022-05-23 08:48:53

1. DrawerLayout - menu wysuwane

Zawartość Activity, automatycznie reagująca na swipe right

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"   
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <!--"Normalna" zawartość ekranu-->

    </RelativeLayout>

    <!--ListView które będzie stanowić wysuwane menu, max 320 dp szerokości-->

    <ListView
        
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#ff0000"  
   
         />

</androidx.drawerlayout.widget.DrawerLayout>
kopiuj



a) Załadowanie ListView w Drawerze:

Tworzymy własny ArrayAdapter, jak poprzednio
Uzależniamy ikonę od indeksu w metodzie getView() ArrayAdaptera


b) Metody DrawerLayoutu

automatycznie reaguje na swipe right / left
można też wymusić wysunięcie kodem:


drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout)
drawerLayout.openDrawer(GravityCompat.START);kopiuj



2. Potrzebne uprawnienia

Dodaj permission INTERNET i ACCESS_NETWORK_STATE

3. Wykrycie statusu sieci

wstaw funkcję z poniższą zawartością do nowej klasy, np Networking, aby móc ją wykorzystać w różnych miejscach aplikacji

ConnectivityManager connectivityManager
   = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
       
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        
if (networkInfo == null || !networkInfo.isConnected())
{
    return false;
}
else{
    return true;
}kopiuj






Uwaga: Przetestowanie działania powinno polegać na wyłączeniu WiFi w telefonie podczas pracy aplikacji
W razie braku internetu - alert


4. ProgressDialog

to kontrolka wyświetlana podczas długotrwałych operacji

w klasie


private ProgressDialog pDialog;kopiuj

w onCreate()

pDialog = new ProgressDialog();
pDialog.setMessage("komunikat");
pDialog.setCancelable(false); // nie da się zamknąć klikając w ekrankopiuj

show / hide


pDialog.show()
pDialog.dismiss()kopiuj




5. Upload library

Jest wiele sposobów na wysłanie danych postem (np klasyczny Apache HttpClient)
Jednak najprostsza w użyciu biblioteka to implementacja biblioteki Volley preferowanej przez google

a) w pliku build.gradle (module)

implementation 'com.bikomobile:multipart:1.3.4'kopiuj

b) zmiana w AndroidManifest.xml

w tagu <application> wstawiamy

android:usesCleartextTraffic="true" kopiuj

(umożliwia przesyłanie danych tekstowych w post)

oraz

<uses-library android:name="org.apache.http.legacy" android:required="false" />kopiuj

c) na koniec sama funkcjonalność multipartRequest umożliwiająca wysłanie pliku oraz dodatkowych danych post

Multipart multipart = new Multipart(context);
multipart.addFile("image/jpeg", "file", "plik.jpg", imageByteArray);
multipart.launchRequest("upload_url",
response -> {
   Log.d("xxx", "success");
},
error -> {
   Log.d("xxx", "error");
});kopiuj





d) dokumentacja

https://github.com/javierugarte/multipart-android

e) zdjęcie można wysłać w postaci byte[] lub uri, poniżej konwersja file to byte[]

pobranie bitmapy ze ścieżki zdjęcia

bmp = BitmapFactory.decodeFile(fotoPath);kopiuj

konwersja bitmapy na tablicę byte[]

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();kopiuj



6. Sharing - wywołanie listy aplikacji, które mogą współdzielić zdjęcie lub inne zasoby

Intent share = new Intent(Intent.ACTION_SEND);kopiuj

typ danych który chcemy współdzielić

share.setType("text/plain"); kopiuj

lokalizacja zapisu

File sdcard = Environment.getExternalStorageDirectory(); kopiuj

przykładowy zapis danych do pliku txt

File file = new File(sdcard, "testshare.txt");
FileWriter writer;
try {
    writer = new FileWriter(file);
    writer.append("any data");
    writer.flush();
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}
kopiuj

pobierz plik i podziel się nim

share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/testshare.txt")); kopiuj

pokazanie okna share

startActivity(Intent.createChooser(share, "Podziel się plikiem!")); kopiuj

w onCreate Activity do share wstaw kod umożliwiający sharowanie zewnętrznych plików przez aplikację

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();kopiuj
StrictMode.setVmPolicy(builder.build());kopiuj


7. SharedPreferences


Android posiada wbudowany mechanizm zapisu prostych danych na urządzeniu

przykład zapisu


SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "any string");
editor.commit();kopiuj


zapisane dane można odczytać w innej Activity niż ta w której się zapisały

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

if (preferences.getString("key", null) != null)
   Log.d("xxx",preferences.getString("key", null))kopiuj




8. serwer

Express ;-)