Android 使用OverlyService按钮拍摄屏幕截图
我使用了覆盖服务按钮。当我单击覆盖按钮时,将拍摄快照,但会引发异常 空对象引用上的android.view.Window.getDecorView() 代码如下 主要活动Android 使用OverlyService按钮拍摄屏幕截图,android,Android,我使用了覆盖服务按钮。当我单击覆盖按钮时,将拍摄快照,但会引发异常 空对象引用上的android.view.Window.getDecorView() 代码如下 主要活动 public class MainActivity extends Activity public View v2; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
public class MainActivity extends Activity
public View v2;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isStoragePermissionGranted();
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int widthContentView = displaymetrics.widthPixels;
int heightContentView = displaymetrics.heightPixels;
Log.e("dis", widthContentView + " " + heightContentView);
v2 = getWindow().getDecorView().getRootView();
Log.e("main", v2.toString());
Intent svc = new Intent(this, OverlayShowingService.class);
startService(svc);
finish();
}
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG, "Permission is granted");
return true;
} else {
Log.v(TAG, "Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
Log.v(TAG, "Permission is granted");
return true;
}
}
public void takeScreenshot(View v) {
Date now = new Date();
android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
try {
Log.e("line", "155");
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";
Log.e("line", mPath);
MainActivity mainActivity = new MainActivity();
Bitmap bitmap;
DisplayMetrics displaymetrics = new DisplayMetrics();
int widthContentView = displaymetrics.widthPixels;
int heightContentView = displaymetrics.heightPixels;
Log.e("dis", widthContentView + " " + heightContentView);
View v1 = getWindow().getDecorView().getRootView();
Log.e("ser", v1.toString());
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
Log.e("line", "163");
Log.e("line", "166");
File imageFile = new File(mPath);
Log.e("line", "174");
FileOutputStream outputStream = new FileOutputStream(imageFile);
Log.e("line", "176");
int quality = 100;
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
Log.e("line", "179");
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
公共类MainActivity扩展活动
公众视野v2;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
i存储许可已授予();
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int-widthContentView=displaymetrics.widthPixels;
int heightContentView=displaymetrics.heightPixels;
Log.e(“dis”,widthContentView+“”+heightContentView);
v2=getWindow().getDecorView().getRootView();
Log.e(“main”,v2.toString());
Intent svc=新Intent(这是OverlyShowingService.class);
startService(svc);
完成();
}
公共布尔值IsStorage PermissionGrated(){
如果(Build.VERSION.SDK_INT>=23){
if(checkSelfPermission(android.Manifest.permission.WRITE\u外部存储)
==PackageManager.权限(已授予){
Log.v(标记“已授予许可”);
返回true;
}否则{
Log.v(标记“权限被撤销”);
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
返回false;
}
}否则{//在sdk上会自动授予权限我想您忘记添加权限了
<manifest .....>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
..............
.............>
<service
android:name=".services.OverlayShowingService"
android:enabled="true"
android:exported="false">
</service>
</application>
</manifest>
能否提供一个带有行号的完整堆栈跟踪,以便我们查看引发异常的位置?现在检查//此行异常cameMainActivity扩展了AppCompatActivity I更改为AppCompatActivity,但出现异常
<manifest .....>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
..............
.............>
<service
android:name=".services.OverlayShowingService"
android:enabled="true"
android:exported="false">
</service>
</application>
</manifest>