2016-04-13 13 views
1

Screenshot aufzunehmen Wie Sie wissen, wenn das Gerät verwurzelt, können SieWie in Android 5.0 oder sdk> 21

Process sh = Runtime.getRuntime().exec("su", null,null); 
OutputStream os = sh.getOutputStream(); 
os.write(("/system/bin/screencap -p " + "/sdcard/img.png").getBytes("ASCII")); 
os.flush(); 
os.close(); 
sh.waitFor(); 

Aber mit SDK> 21 (5.0 oder höher) einen Screenshot mit dem Code übernehmen Es ist nicht Unterstütze diese Funktion. Also, ich möchte wissen, wie man Screenshot mit Android 5.0 oder höher von Service (eine andere Anwendung).

Ich habe über MediaProjectionManager gesehen, aber es muss onActivityResult für empfangenes Ergebnis ausgeführt werden, aber im Service kann es nicht aktiv sein.

Antwort

-1

Pragmatisch kurz nehmen Bildschirm für alle Geräte

http://paste.ofcode.org/HwN4VWZqjwMPeJ92Y2C6hg

+0

Ich versuche einen Schuss von Service Android. Wenn ich auf diese Weise verwende, benötigen Sie eine Stammansicht. –

+0

Entschuldigung, ich möchte einen Screenshot anderer App machen, wenn Sie rootView bekommen, nehmen Sie nur den Bildschirm itseft –

0

Dieser wird für Sie: declare diese global in Ihrer Klasse File-

Privat Datei imagefile; private void takeScreenshot() {

try { 
     String mPath = Environment.getExternalStorageDirectory().toString() +"\\/pic";   View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 

     imageFile = new File(mPath); 

     FileOutputStream outputStream = new FileOutputStream(imageFile); 
     int quality = 100; 
     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
+0

Mit dieser Methode müssen Sie root View bekommen. Aber ich möchte eine Aufnahme von serivce machen. Kennen Sie eine andere Methode? –

0

Zuerst eine Aktivität Objekt in Ihrer Aktivitätsklasse wie this-

public class FirstScreenActivity extends AppCompatActivity { 

public static Activity mActivity; 
private File imageFile; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mActivity=this; 
} 

@Override 
protected void onResume() { 
    super.onResume();} 

dann verwenden statische mActivity in Ihre nicht-Aktivität Klassendatei

mit Code wie folgt hinzufügen oben in vorherige Antwort:

View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView(); 
+0

Ich weiß, aber Sie verstehen meine Frage nicht, ich möchte Bildschirm anderer Anwendung erfassen. –

+0

Oh, wenn das der Fall ist, ist es tatsächlich ein Sicherheitsrisiko, aber ja, du kannst das tun. –

+0

Hier ist der Trick ... Sie können einen Empfänger verwenden ... spezifizieren Sie es in Ihrer Manifest-Datei, und verwenden Sie dann das spezifische Ereignis (viele Ereignisse sind bereits in Android definiert, wenn der Bildschirm entsperrt ist, eine neue SMS empfangen , gesendet, das Telefon ist gebootet) Ihr angegebener Empfänger enthält einen Code zur Aufnahme von Screenshots und arbeitet an bestimmten Ereignissen im Empfänger. NUR BESCHRÄNKUNG IST, DASS du deinen Empfänger nur bei DIESEN VORDEFINIERTEN Ereignissen benutzen kannst. Wenn das für Sie klappt. Ich werde den Code teilen, den ich 2 Monate zurück geschrieben habe .. :) –

0

Hier ist der Empfänger, der in Ihrem Manifest File-

012 angegeben werden soll,
<receiver android:name=".reciever.EventReceiver"> 
     <intent-filter > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      <action android:name="android.intent.action.USER_PRESENT"/> 
     </intent-filter> 
    </receiver> 

wie diese Aktion können Sie auch andere Aktion wählen. HINWEIS: Vergessen Sie nicht, Berechtigungen für die Aktionen hinzuzufügen, die Sie in Ihrem Empfänger verwenden werden. Dies ist der Empfänger Klasse, wo Sie Ihren Code (in diesem Fall die Aufnahme von Schnappschüssen) schreiben wird -

public class EventReceiver extends BroadcastReceiver { 
private File imageFile; 
private Context mContext; 

@Override 
public void onReceive(final Context context, Intent intent) { 
    mContext=context; 
    takeScreenshot(); 
//you can execute some of your other code also 

} 
private void takeScreenshot() { 
    try { 
     String mPath = Environment.getExternalStorageDirectory().toString() +"\\/pic"; 
     View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 

     imageFile = new File(mPath); 

     FileOutputStream outputStream = new FileOutputStream(imageFile); 
     int quality = 100; 
     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 

}

verwenden und die OnReceive() Ihres Receivers Klasse auf bestimmte Ereignisaktion erhalten ausgeführt wird dass Sie in Ihrem Manifest angegeben haben.

Verwandte Themen