From 2dc2fb39a2ef0f0323435eb875550ac8bb544660 Mon Sep 17 00:00:00 2001 From: Gersbacher Pirmin <pg045@hdm-stuttgart.de> Date: Sat, 12 Dec 2020 03:01:17 +0100 Subject: [PATCH] =?UTF-8?q?Export=20der=20Ergebnisse=20-=20erste=20Schritt?= =?UTF-8?q?e=20*=20Im=20Accessibility=20Service=20k=C3=B6nnen=20nun=20Info?= =?UTF-8?q?rmationen=20gespeichert=20werden=20(Text=20Datei)=20*=20in=20de?= =?UTF-8?q?r=20Main=20Activity=20k=C3=B6nnen=20diese=20Daten=20anschlie?= =?UTF-8?q?=C3=9Fend=20ausgelesen=20und=20als=20Email=20versendet=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 13 +- .../CustomButton.java | 4 - .../MainActivity.java | 107 ++++++++++ .../MyAccessibilityServiceV2.java | 199 +++++++++++++++++- app/src/main/res/layout/activity_main.xml | 8 +- app/src/main/res/layout/floatingwindow.xml | 27 +++ app/src/main/res/xml/provider_paths.xml | 5 + 7 files changed, 354 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/layout/floatingwindow.xml create mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3613f1d..4d45478 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" + android:requestLegacyExternalStorage="true" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" @@ -34,8 +35,18 @@ android:name="android.accessibilityservice" android:resource="@xml/serviceconfig" /> </service> - </application> + <provider + android:authorities="com.example.accessibilityserviceappv2.fileprovider" + android:name="androidx.core.content.FileProvider" + android:grantUriPermissions="true" + android:exported="false"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/provider_paths"/> + </provider> + + </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java b/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java index 9271232..3166ebb 100644 --- a/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java +++ b/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java @@ -99,11 +99,7 @@ public class CustomButton extends androidx.appcompat.widget.AppCompatButton /*im } */ - public void openDialog(){ - ExampleDialog exampleDialog = new ExampleDialog(); - - } public String showContent(){ return this.contentDescription; diff --git a/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java b/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java index 46c36c2..f605eea 100644 --- a/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java +++ b/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java @@ -1,8 +1,28 @@ package com.example.accessibilityserviceappv2; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.FileProvider; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; public class MainActivity extends AppCompatActivity { @@ -10,5 +30,92 @@ public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + ActivityCompat.requestPermissions(MainActivity.this, new String[]{WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE}, 1); + + Button testButoon = (Button) findViewById(R.id.button25); + + Context context = getApplicationContext(); + + testButoon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + export(); + } + }); + + + } + + + + private String readFromFile(Context context) { + + String ret = ""; + + try { + InputStream inputStream = context.openFileInput("mytesttext.txt"); + + if ( inputStream != null ) { + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + String receiveString = ""; + StringBuilder stringBuilder = new StringBuilder(); + + while ( (receiveString = bufferedReader.readLine()) != null ) { + stringBuilder.append("\n").append(receiveString); + } + + inputStream.close(); + ret = stringBuilder.toString(); + } + } + catch (FileNotFoundException e) { + Log.e("login activity", "File not found: " + e.toString()); + } catch (IOException e) { + Log.e("login activity", "Can not read file: " + e.toString()); + } + + return ret; + } + + + public void export(){ + + //generate data + StringBuilder data = new StringBuilder(); + data.append("Time, Distance"); + for(int i = 0; i<5; i++ ){ + data.append("\n"+String.valueOf(i)+","+String.valueOf(i*i)); + } + + try{ + //saving the file into device + FileOutputStream out = openFileOutput("data.csv", Context.MODE_PRIVATE); + out.write((data.toString()).getBytes()); + out.close(); + + + //exporting + Context context = getApplicationContext(); + + + File filelocation = new File(getFilesDir(), "mytesttext.txt"); + Uri path = FileProvider.getUriForFile(context, "com.example.accessibilityserviceappv2.fileprovider", filelocation); + Intent fileIntent = new Intent(Intent.ACTION_SEND); + //fileIntent.setAction(Intent.ACTION_SEND); + fileIntent.setType("text/csv"); + fileIntent.putExtra(Intent.EXTRA_SUBJECT, "Data"); + fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + fileIntent.putExtra(Intent.EXTRA_STREAM, path); + //fileIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + //fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(Intent.createChooser(fileIntent, "Send Mail")); + + } + catch (Exception e){ + e.printStackTrace(); + } + + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java b/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java index 5ee6dd0..5e21c02 100644 --- a/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java +++ b/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java @@ -1,8 +1,11 @@ package com.example.accessibilityserviceappv2; import android.accessibilityservice.AccessibilityService; +import android.content.ComponentName; +import android.content.Intent; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.RectShape; +import android.net.Uri; import android.text.Html; import android.util.Log; import android.view.ViewGroup; @@ -31,8 +34,20 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.core.app.ActivityCompat; +import androidx.core.content.FileProvider; + import org.w3c.dom.Text; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -40,6 +55,10 @@ import java.util.List; import java.util.List; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static java.net.Proxy.Type.HTTP; + public class MyAccessibilityServiceV2 extends AccessibilityService { FrameLayout mLayout; @@ -82,6 +101,7 @@ public class MyAccessibilityServiceV2 extends AccessibilityService { case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: { logNodeHierarchy(getRootInActiveWindow(), 0); + addExportButton(); } case AccessibilityEvent.TYPE_VIEW_CLICKED: { @@ -358,4 +378,181 @@ public class MyAccessibilityServiceV2 extends AccessibilityService { } -} + + public void addExportButton(){ + + Context context = getApplicationContext(); + + + Button exportButton = new Button(this); + exportButton.setText("Export Button"); + + WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); + + + WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); + + lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; + lp.format = PixelFormat.TRANSLUCENT; + lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + // lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; + lp.width = WindowManager.LayoutParams.WRAP_CONTENT; + lp.height = WindowManager.LayoutParams.WRAP_CONTENT; + //lp.alpha = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + lp.gravity = Gravity.TOP; + lp.x = 0; + lp.y = 0; + + exportButton.setOnClickListener(new View.OnClickListener(){ + public void onClick(View v){ + //export(); + //emailTest(); + //intentTest(); + String btnNumber = "Test Anzahl " + btnCounter; + //writeFileOnInternalStorage(context, "testFilename", "testFileBodyText"); + //writeToFile(btnNumber, context); + String testText = readFromFile(context); + Log.v(LOG_TAG, testText); + + } + }); + + + wm.addView(exportButton, lp); + + } + + + public void export(){ + + //generate data + StringBuilder data = new StringBuilder(); + data.append("Time, Distance"); + for(int i = 0; i<5; i++ ){ + data.append("\n"+String.valueOf(i)+","+String.valueOf(i*i)); + } + + try{ + //saving the file into device + FileOutputStream out = openFileOutput("data.csv", Context.MODE_PRIVATE); + out.write((data.toString()).getBytes()); + out.close(); + + /* + //exporting + Context context = getApplicationContext(); + File filelocation = new File(getFilesDir(), "data.csv"); + Uri path = FileProvider.getUriForFile(context, "com.example.accessibilityserviceappv2.fileprovider", filelocation); + Intent fileIntent = new Intent(); + fileIntent.setAction(Intent.ACTION_SEND); + fileIntent.putExtra(Intent.EXTRA_SUBJECT, "Data"); + fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + fileIntent.putExtra(Intent.EXTRA_STREAM, path); + fileIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + //fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(Intent.createChooser(fileIntent, "Send Mail")); + */ + } + catch (Exception e){ + e.printStackTrace(); + } + + + } + + public void emailTest(){ +/* Intent emailIntent = new Intent(Intent.ACTION_SEND); + //Intent emailIntent = new Intent(App.getContext(), App.class); + emailIntent.setType("text/html"); + emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients + emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); + emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); + emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); + emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + emailIntent.setComponent(new ComponentName(getApplicationContext().getPackageName(), App.class.getName())); + + startActivity(Intent.createChooser(emailIntent, "Send Email"));*/ +// You can also attach multiple items by passing an ArrayList of Uris + + } + + public void intentTest(){ + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ComponentName cn = new ComponentName(this, MainActivity.class); + intent.setComponent(cn); + startActivity(intent); + } + + + public void writeFileOnInternalStorage(Context mcoContext, String sFileName, String sBody){ + File dir = new File(mcoContext.getFilesDir(), "mydir"); + +/* + try { + File myFile = new File("Your File name"); + myFile.createNewFile(); + FileOutputStream fOut = new FileOutputStream(myFile); + OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut); + myOutWriter.append("testtext"); + myOutWriter.close(); + fOut.close(); + Toast.makeText(getApplicationContext(), "Done writing SD 'mysdfile.txt", Toast.LENGTH_SHORT).show(); + + } + catch (Exception e) + { + Toast.makeText(getApplicationContext(), e.getMessage(),Toast.LENGTH_SHORT).show(); + }*/ + + + + } + + private void writeToFile(String data,Context context) { + try { + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("mytesttext.txt", Context.MODE_PRIVATE)); + outputStreamWriter.write(data); + outputStreamWriter.close(); + } + catch (IOException e) { + Log.e("Exception", "File write failed: " + e.toString()); + } + } + + private String readFromFile(Context context) { + + String ret = ""; + + try { + InputStream inputStream = context.openFileInput("mytesttext.txt"); + + if ( inputStream != null ) { + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + String receiveString = ""; + StringBuilder stringBuilder = new StringBuilder(); + + while ( (receiveString = bufferedReader.readLine()) != null ) { + stringBuilder.append("\n").append(receiveString); + } + + inputStream.close(); + ret = stringBuilder.toString(); + } + } + catch (FileNotFoundException e) { + Log.e("login activity", "File not found: " + e.toString()); + } catch (IOException e) { + Log.e("login activity", "Can not read file: " + e.toString()); + } + + return ret; + } + + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 439d3a0..43c711c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -17,12 +17,14 @@ app:layout_constraintTop_toTopOf="parent" /> <androidx.appcompat.widget.AppCompatButton - android:id="@+id/button2" + android:id="@+id/button25" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Button" + android:text="Export Data" app:layout_constraintBottom_toTopOf="@+id/textView" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.548" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/floatingwindow.xml b/app/src/main/res/layout/floatingwindow.xml new file mode 100644 index 0000000..43cfc80 --- /dev/null +++ b/app/src/main/res/layout/floatingwindow.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:minHeight="250dp" + android:layout_height="wrap_content" + android:background="@color/LightGrey"> + + <TextView + android:id="@+id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="This is the floating text view\n Hallo" + android:lineSpacingExtra="20sp" + android:fontFamily="sans-serif-thin" + android:textColor="@color/Black" + android:textSize="20sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.497" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.155" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000..71f66a9 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,5 @@ +<paths> + <files-path + name="data" + path="./"/> +</paths> \ No newline at end of file -- GitLab