Android and iOS。現在の機能はスクリーンショットを取得し、コードでその画像を使用しています。そのため、ポータブルライブラリにインターフェイスがあります。
public interface IFileSystemService
{
string GetAppDataFolder();
}
次のコードを使用して、ポータブルライブラリでもスクリーンショットを撮影しています。
static public bool TakeScreenshot()
{
try
{
byte[] ScreenshotBytes = DependencyService.Get<Interface.IScreenshotManager>().TakeScreenshot();
return true;
}
catch (Exception ex)
{
}
return false;
}
これは、AndroidまたはiOSバージョンを呼び出します。
アンドロイド:
class ScreenshotManagerAndroid : IScreenshotManager
{
public static Activity Activity { get; set; }
public byte[] TakeScreenshot()
{
if (Activity == null)
{
throw new Exception("You have to set ScreenshotManager.Activity in your Android project");
}
var view = Activity.Window.DecorView;
view.DrawingCacheEnabled = true;
Bitmap bitmap = view.GetDrawingCache(true);
byte[] bitmapData;
using (var stream = new MemoryStream())
{
bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
bitmapData = stream.ToArray();
}
return bitmapData;
}
ここでの質問は、アプリから現在のアクティビティを取得することです。
Xamarin 2.5のリリース以降、Xamarin.Forms.Forms.Contextは 廃止 です。コンテキストは次のように取得できるようになりました。
var currentContext = Android.App.Application.Context;
より良い方法は、 Current Activity Plugin を使用することです。次に、_CrossCurrentActivity.Current.Activity
_を実行します。
プラグインを使用したくなく、アプリにActivity
が1つしかない場合は、MainActivity
に静的変数を割り当てて、このように必要な場所を参照することで回避できます。 :
_public class MainActivity : FormsApplicationActivity {
public static Context Context;
public MainActivity () {
Context = this;
}
}
_
カスタムレンダラー内でContext
が必要な場合は、次のように、コンストラクターに渡されるContext
を使用します。
_public class MyEntryRenderer : EntryRenderer {
private readonly Context _context;
public MyEntryRenderer(Context context) : base(context) {
_context = context;
}
// Now use _context or ((Activity)_context) any where you need to (just make sure you pass it into the base constructor)
}
_
古い非推奨の方法はvar view = ((Activity)Xamarin.Forms.Forms.Context).Window.DecorView;
です
XamarinはActivity
を_Forms.Context
_に自動的に割り当てます。
var activity = (Activity)Forms.Context;
またはMainActivityを使用している場合
var activity = (MainActivity)Forms.Context;