2015-07-11 16 views
6

Ich bin neu in Android-Entwicklung.Hören Sie für Screenshot Aktion in Android

Ich mache eine Anwendung, die reagieren wird, wenn Screenshot von Android-Handy genommen wird. Ich habe gehört, dass Android ermöglicht solche Aktionen können von Broadcast-Empfänger erkannt werden, so habe ich durch Android-Entwickler Dokumentation, here gegangen.

Ich denke, dass die Framework-Entwickler vergessen oder nicht einen Screenshot-Broadcast-Code implementiert haben, weil sie diese Aktion nicht in ihrer Dokumentation aufgelistet haben.

Gibt es eine andere Möglichkeit, ich kann Screenshot Maßnahmen zu hören?

+0

Hey, hast du teste d [diese Lösung] (http://stackoverflow.com/a/14951594/518179) mit FileObserver? –

+0

@renam nope .. Ich werde es überprüfen und informieren Sie bald – droidev

+1

Just FYI Ich denke, Dateibeobachter werden funktionieren, aber einige Versionen sind fehlerhaft mit es wie Android 6.0 https://StackOverflow.com/Questions/36237314/Fileobserver-and- contentobserver-nicht-arbeiten-in-android-Marshmallow – Bqin1

Antwort

2

Sie können das ScreenShot-Ereignis mit ContentObserver erkennen. Ich benutze es in einem meiner Projekte.

ScreenShotContentObserver.java

public abstract class ScreenShotContentObserver extends ContentObserver { 

    private Context context; 
    private boolean isFromEdit = false; 
    private String previousPath; 

    public ScreenShotContentObserver(Handler handler, Context context) { 
     super(handler); 
     this.context = context; 
    } 

    @Override 
    public boolean deliverSelfNotifications() { 
     return super.deliverSelfNotifications(); 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
    } 

    @Override 
    public void onChange(boolean selfChange, Uri uri) { 
     Cursor cursor = null; 
     try { 
      cursor = context.getContentResolver().query(uri, new String[]{ 
        MediaStore.Images.Media.DISPLAY_NAME, 
        MediaStore.Images.Media.DATA 
      }, null, null, null); 
      if (cursor != null && cursor.moveToLast()) { 
       int displayNameColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME); 
       int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
       String fileName = cursor.getString(displayNameColumnIndex); 
       String path = cursor.getString(dataColumnIndex); 
       if (new File(path).lastModified() >= System.currentTimeMillis() - 10000) { 
        if (isScreenshot(path) && !isFromEdit && !(previousPath != null && previousPath.equals(path))) { 
         onScreenShot(path, fileName); 
        } 
        previousPath = path; 
        isFromEdit = false; 
       } else { 
        cursor.close(); 
        return; 
       } 
      } 
     } catch (Throwable t) { 
      isFromEdit = true; 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
     } 
     super.onChange(selfChange, uri); 
    } 

    private boolean isScreenshot(String path) { 
     return path != null && path.toLowerCase().contains("screenshot"); 
    } 

    protected abstract void onScreenShot(String path, String fileName); 

} 

Und verwenden Sie diese Klasse in Ihrer Tätigkeit: -

public class MainActivity extends AppCompatActivity { 

    private ScreenShotContentObserver screenShotContentObserver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     screenShotContentObserver = new ScreenShotContentObserver(handler, this) { 
      @Override 
      protected void onScreenShot(String path, String fileName) { 
       File file = new File(path); //this is the file of screenshot image 
      } 
     }; 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     getContentResolver().registerContentObserver(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       true, 
       screenShotContentObserver 
     ); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     try { 
      getContentResolver().unregisterContentObserver(screenShotContentObserver); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     try { 
      getContentResolver().unregisterContentObserver(screenShotContentObserver); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

nicht Observer in oder onDestroy Methoden eines Activity

zu stoppen Vergessen
Verwandte Themen