Android: 如何隐藏或关闭最上面的activity?
Android: How to hide or close topmost activity?
在我的应用程序中,我需要使用 INTENT_ACTION_STILL_IMAGE_CAMERA. The reason of this action is that in this case, I can use the Pro camera mode, like manual ISO, exposure time, etc., while using the action ACTION_IMAGE_CAPTURE 操作启动内置相机应用程序,这是不可能的(至少对于我的三星 Galaxy S20+ 设备的内置相机应用程序而言)
使用广播接收器 Intent 过滤器ACTION_NEW_PICTURE我也能够捕捉到照片的 URI。
我需要的是在拍摄照片后从广播接收器的 OnReceive 方法中隐藏内置相机 Activity。到目前为止我尝试的是我通过指定意图操作标志 FLAG_ACTIVITY_REORDER_TO_FRONT 和 FLAG_ACTIVITY_SINGLE_TOP 从 OnReceive 调用我的 Activity 这种方式(C# 语言片段,但几乎与 Java):
public override void OnReceive(Context context, Intent intent) {
Toast.MakeText(context, $"Data1: {intent.DataString}", ToastLength.Short).Show();
var path = Path.Combine(context.CacheDir.AbsolutePath, $"Photo_{DateTime.Now.ToString("yyyyMMMdd_HHmmss")}.jpg");
try {
// copy the photo to app cache dir
using (var outs = File.Create(path)) {
using (var ins = context.ContentResolver.OpenInputStream(intent.Data)) {
ins.Seek(0, SeekOrigin.Begin);
ins.CopyTo(outs);
}
}
var a = Xamarin.Essentials.Platform.CurrentActivity;
var tvInfo = a.FindViewById<AppCompatTextView>(Resource.Id.tvInfo);
tvInfo.Append("Picture was taken and saved to:");
tvInfo.Append($"{path}{SysEnv.NewLine}{SysEnv.NewLine}");
// hide the builtin camera's Activity by brining my Activity to top
var i = new Intent(context, typeof(MainActivity)).SetFlags(ActivityFlags.ReorderToFront | ActivityFlags.SingleTop);
a.StartActivity(i);
}
catch (Exception ex) {
Toast.MakeText(context, $"Error: {ex.Message}", ToastLength.Short).Show();
}
}
以下是我启动相机的方式:
var btnTake = FindViewById<AppCompatButton>(Resource.Id.btnTake);
btnTake.Click += (s, e) => {
var i = new Intent(MediaStore.IntentActionStillImageCamera);
var r = i.ResolveActivity(this.PackageManager);
if (r != null) {
StartActivity(i);
}
};
上面的问题是它只在第一次尝试时有效,这意味着我点击我的应用程序按钮,内置摄像头启动。当我拍照时,照片被保存并复制到我的应用程序的缓存目录,内置相机的 Activity 消失,我的 Activity 出现。
但是在第二次尝试时,我的 activity 没有出现,内置摄像头的 Activity 保持在顶部。
知道如何隐藏或关闭内置摄像头的 Activity?
感谢@DavidWasser 终于成功了!!!
解决方案是添加一个新的 dummy activity 从其 OnCreate( ) 最后调用广播接收器的 OnReceive():
var i = new Intent(context, typeof(Dummy));
context.StartActivity(i);
在我的应用程序中,我需要使用 INTENT_ACTION_STILL_IMAGE_CAMERA. The reason of this action is that in this case, I can use the Pro camera mode, like manual ISO, exposure time, etc., while using the action ACTION_IMAGE_CAPTURE 操作启动内置相机应用程序,这是不可能的(至少对于我的三星 Galaxy S20+ 设备的内置相机应用程序而言)
使用广播接收器 Intent 过滤器ACTION_NEW_PICTURE我也能够捕捉到照片的 URI。
我需要的是在拍摄照片后从广播接收器的 OnReceive 方法中隐藏内置相机 Activity。到目前为止我尝试的是我通过指定意图操作标志 FLAG_ACTIVITY_REORDER_TO_FRONT 和 FLAG_ACTIVITY_SINGLE_TOP 从 OnReceive 调用我的 Activity 这种方式(C# 语言片段,但几乎与 Java):
public override void OnReceive(Context context, Intent intent) {
Toast.MakeText(context, $"Data1: {intent.DataString}", ToastLength.Short).Show();
var path = Path.Combine(context.CacheDir.AbsolutePath, $"Photo_{DateTime.Now.ToString("yyyyMMMdd_HHmmss")}.jpg");
try {
// copy the photo to app cache dir
using (var outs = File.Create(path)) {
using (var ins = context.ContentResolver.OpenInputStream(intent.Data)) {
ins.Seek(0, SeekOrigin.Begin);
ins.CopyTo(outs);
}
}
var a = Xamarin.Essentials.Platform.CurrentActivity;
var tvInfo = a.FindViewById<AppCompatTextView>(Resource.Id.tvInfo);
tvInfo.Append("Picture was taken and saved to:");
tvInfo.Append($"{path}{SysEnv.NewLine}{SysEnv.NewLine}");
// hide the builtin camera's Activity by brining my Activity to top
var i = new Intent(context, typeof(MainActivity)).SetFlags(ActivityFlags.ReorderToFront | ActivityFlags.SingleTop);
a.StartActivity(i);
}
catch (Exception ex) {
Toast.MakeText(context, $"Error: {ex.Message}", ToastLength.Short).Show();
}
}
以下是我启动相机的方式:
var btnTake = FindViewById<AppCompatButton>(Resource.Id.btnTake);
btnTake.Click += (s, e) => {
var i = new Intent(MediaStore.IntentActionStillImageCamera);
var r = i.ResolveActivity(this.PackageManager);
if (r != null) {
StartActivity(i);
}
};
上面的问题是它只在第一次尝试时有效,这意味着我点击我的应用程序按钮,内置摄像头启动。当我拍照时,照片被保存并复制到我的应用程序的缓存目录,内置相机的 Activity 消失,我的 Activity 出现。 但是在第二次尝试时,我的 activity 没有出现,内置摄像头的 Activity 保持在顶部。 知道如何隐藏或关闭内置摄像头的 Activity?
感谢@DavidWasser 终于成功了!!!
解决方案是添加一个新的 dummy activity 从其 OnCreate( ) 最后调用广播接收器的 OnReceive():
var i = new Intent(context, typeof(Dummy));
context.StartActivity(i);