// selectPath : SQLite DB 파일 백업 폴더 위치

Java.IO.File sd = new Java.IO.File(selectPath);

// 폴더가 존재하지 않으면 만든다.

if (!sd.Exists())
{
    sd.Mkdirs();
}

Java.IO.File data = Android.OS.Environment.DataDirectory;
// System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);


FileChannel source = null;
FileChannel destination = null;

//  data 가 두번 붙는거 방지 (안드로이드 버전에 따라 다르게 나오는 부분 처리)

List<string> pathList = Constant.DBPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).ToList();

if (pathList[0] == "data")
{
    pathList.RemoveAt(0);
}

string path = string.Join("/", pathList);

string currentDBPath = path;

string backupDBPath = "test.db";
Java.IO.File currentDB = new Java.IO.File(data, currentDBPath);
Java.IO.File backupDB = new Java.IO.File(sd, backupDBPath);
try
{
    source = new FileInputStream(currentDB).Channel;
    destination = new FileOutputStream(backupDB).Channel;
    destination.TransferFrom(source, 0, source.Size());
    source.Close();
    destination.Close();
    Toast.MakeText(this, "백업 완료! - " + backupDB.Path, ToastLength.Long).Show();
}
catch (Java.Lang.Exception ex)
{
    ex.PrintStackTrace();
}

 

Xamarin Forms 에서

푸쉬알림을 Firebase, App Center 를 이용해서 처리하는 방법을 간략히 정리해봅니다.

1. Firebase 가입

https://firebase.google.com/ 가입 후 (구글 및 다른 계정으로도 로그인 가능)

https://console.firebase.google.com/ 로 이동하여 프로젝트 추가

Android 앱에 Firebase 추가 선택

안드로이드 프로젝트의 패키지명 기입 후 앱등록 이후 2,3 단계는 그냥 확인.

좌측 상단의 톱니바퀴 선택 후 프로젝트 설정으로 이동하고

클라우드 메시징 탭을 선택.

위그림과 같이 Server Key 와 SenderId 정보를 기억.

 

2. Xamarin Forms 프로젝트 구성 (.Net Standard)

 

 

3. Nuget 에서 Microsoft.AppCenter.Push 설치

 

4. App Center 가입

https://appcenter.ms 사이트로 이동하여 가입 (마이크로소프트 계정 및 구글, 페이스북 으로 로그인 가능)

App 만들기 하여 아래 그림과 같이 Android 와 Xamarin 을 선택 하여 이름 지정 후 생성

Push 를 선택하고 가이드에 따라 코딩.


AndroidManifest.xml 파일에 아래 내용  추가
<permission android:protectionLevel="signature"android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permissionandroid:name="${applicationId}.permission.C2D_MESSAGE" />

${applicationId} 은 패키지명으로 변경 해야함.


안드로이드인 경우 아래 처럼
Push.SetSenderId("{SenderId}");
AppCenter.Start("282b7f5d-18b4-4e26-8920-8414d6df405b", typeof(Push));

Xamarin Forms 인 경우 아래 처럼 코딩
Push.SetSenderId("{SenderId}");
LoadApplication(new App());

SenderId 는 1번에서 기억해 놓은 senderID 를 이용

▼ Firebase 의 Server Key 기입

 

5. 추가 프로젝트 설정

안드로이드에서 permission 을 INTERNET 도 주어야 함

AndroidManifest.xml 파일에 아래 내용  추가

<uses-permission android:name="android.permission.INTERNET" />

 

 

참고링크

https://docs.microsoft.com/en-us/appcenter/sdk/push/xamarin-android

 

다른 방법

https://onesignal.com 을 통해서도 처리 가능

=> https://www.youtube.com/watch?v=EPIrNxuwAj8&t=851s
=> https://documentation.onesignal.com/docs/xamarin-sdk-setup

Debug 에서는 에러가 발생이 안되었는데

배포하려고 Release 에서 빌드하니 아래와 같은 에러가 발생되었다.

심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
오류  "LinkAssemblies" 작업에서 예기치 않은 오류가 발생했습니다.
Mono.Linker.MarkException: Error processing method: 'System.Void Android.Support.V4.App.ActivityCompatApi23/SharedElementCallbackImpl::n_OnSharedElementsArrived_Ljava_util_List_Ljava_util_List_Landroid_app_SharedElementCallback_OnSharedElementsReadyListener_(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr)' in assembly: 'Xamarin.Android.Support.Compat.dll' ---> Mono.Cecil.ResolutionException: Failed to resolve Android.App.SharedElementCallback/IOnSharedElementsReadyListener
   위치: Mono.Linker.Steps.MarkStep.HandleUnresolvedType(TypeReference reference)
   위치: Mono.Linker.Steps.MarkStep.MarkType(TypeReference reference)
   위치: MonoDroid.Tuner.MonoDroidMarkStep.MarkType(TypeReference reference)
   위치: Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)
   위치: Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method)
   위치: Mono.Linker.Steps.MarkStep.ProcessQueue()
   --- 내부 예외 스택 추적의 끝 ---
   위치: Mono.Linker.Steps.MarkStep.ProcessQueue()
   위치: Mono.Linker.Steps.MarkStep.ProcessEntireQueue()
   위치: Mono.Linker.Steps.MarkStep.Process()
   위치: Mono.Linker.Steps.MarkStep.Process(LinkContext context)
   위치: Mono.Linker.Pipeline.Process(LinkContext context)
   위치: MonoDroid.Tuner.Linker.Process(LinkerOptions options, LinkContext& context)
   위치: Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)
   위치: Xamarin.Android.Tasks.LinkAssemblies.Execute()
   위치: Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   위치: Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() SMSConveyPro  

프로젝트->속성->Android 옵션 에서 아래 처럼 Linking 항목을 SDK 및 사용자 어셈블리 로 변경하니 정상적으로 빌드가 되었다.

 

참고 : https://forums.xamarin.com/discussion/22358/building-release-version-for-android-failed

어플 실행 시 splash screen 을 보여주고 싶어 방법을 찾아보니 아래 출처에 잘 소개가 되어있어 소개합니다.

출처 : https://forums.xamarin.com/discussion/19362/xamarin-forms-splashscreen-in-android

 

우선 splash 에 보여줄 이미지를 준비합니다.

아래 예시에서 splash 에 사용될 이미지 명은 'icon' 입니다.

우선 Activity 를 만들어 줍니다. ( SplashScreen )

아래 내용은 Theme = "@style/Theme.Splash" 여기에 정의된 테마화면을 보여주고 난다음

메인 화면인 MainActivity 를 호출하고 자기자신은 Finish() 하여 Splash 화면을 닫아버립니다.

SplashScreen.cs:

    [Activity(Label = "MyApp", MainLauncher = true, NoHistory = true, Theme = "@style/Theme.Splash",
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class SplashScreen : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            var intent = new Intent(this, typeof(MainActivity));
            StartActivity(intent); Finish();
        }
    }

아래가 실제 메인 화면입니다.

MainActivity.cs:

[Activity(Label = "MyApp", Theme = "@android:style/Theme.Holo", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : AndroidActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);       
           
            // Xamarin Forms
            Xamarin.Forms.Forms.Init(this, bundle);
            SetPage(App.GetMainPage());

            // Xamarin Android
            SetContentView(Resource.Layout.Main);
        }
    }

아래는 실제 화면에 보여질 이미지의 속성을 정의한다고 보면 될것 같습니다.

"@drawable/icon" 이 항목이 실제 화면에 보여질 이미지에 해당됩니다.

아래 두항목(gravity,layout_gravity) 은 가운데 이미지를 위치시키위한 내용입니다.

Resources.Drawable.SplashScreen.xml:

<?xml version="1.0" encoding="utf-8" ?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/icon" 
        android:gravity="center"
        android:layout_gravity="center"/>

아래는 화면 구조를 정의하는 내용입니다.

windowNoTitle 가 true 로 되어야 상단에 toolbar 가 사라지게됩니다.

Resources.Values.Styles.xml

<resources>
  <style name="Theme.Splash"    parent="android:Theme">
    <item name="android:windowBackground">
      @drawable/splashscreen
    </item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">false</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:backgroundDimEnabled">true</item>
  </style>
</resources>

 

이렇게 하고 시뮬레이터로 동작 시키게되면 어플이 실행되기전에

스플래시이미지가 보인후 메인 화면으로 진입하게 됩니다.

 

아래는 제가 실제 적용한 내용입니다.

위 내용과는 조금 다른 부분이있습니다.

SplashActivity.cs

[Activity(Label = "SMSConvey", Theme = "@style/SplashTheme", MainLauncher = true, NoHistory = true, Icon = "@drawable/conveysmsicon", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class SplashActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            Thread thread = new Thread(() =>
            {
                this.RunOnUiThread(() =>
                SimulateStartup());
            }
            );
            thread.Start();

        }

        // Launches the startup task
        protected override void OnResume()
        {
            base.OnResume();
        }

        // Prevent the back button from canceling the startup process
        public override void OnBackPressed() { }

        // Simulates background work that happens behind the splash screen
        private void SimulateStartup()
        {
            //await Task.Delay(1000); // Simulate a bit of startup work.
            Thread.Sleep(500);
            StartActivity(new Intent(Application.Context, typeof(MainActivity)));
            Finish();
        }
    }

Styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="SplashTheme" parent ="@android:Theme">
    <item name="android:windowBackground">@drawable/splash_screen</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsTranslucent">false</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:backgroundDimEnabled">true</item>
  </style>
</resources>

splash_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <color android:color="#FFFFFF"/>
  </item>
  <item>
    <bitmap
        android:src="@drawable/smsconvey_splash"
        android:tileMode="disabled"
        android:gravity="center"/>
  </item>
</layer-list>

참고

https://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/

http://www.c-sharpcorner.com/UploadFile/1e050f/creating-splash-screen-for-android-app-in-xamarin/

지난 포스팅에서는 AdMob 에서 광고 ID 까지 가져와 봤습니다. (http://kjcoder.tistory.com/276)

제가 획득한 광고 ID 는 ca-app-pub-4681470946279796/9940497268 입니다.

이제 프로젝트 하나를 만듭니다.

프로젝트는 다 아시겠지만 Android 에서 비어있는 앱을 선택하여 프로젝트를 생성합니다.

프로젝트가 구성되면

Nuget 에서 Goole Play Ads 를 설치해야합니다.

프로젝트 우클릭 메뉴에서 NuGet 패키지 관리.. 로 들어갑니다.

여기서 찾아보기 탭을 선택 후 Google Play Ads 를 검색해서 가장 처음에 있는 항목을 선택하고 설치를 진행합니다.

확인.

동의함.

설치가 완료되면 참조에 아래와 같이 라이브러리들이 쫙~ 추가 되어있습니다.

(Lite 버전도 있던데 이것만 깔아도 되는지는 테스트 해봐야 알것 같습니다. 용량이 확실히 적긴하더군요.)

이제 구글 광고를 삽입하기 위한 사전 준비는 완료 되었습니다.

 

프로젝트의 string.xml 파일에 광고 ID 를 선언합니다.

(직접 입력해도 되나 이렇게 관리하는게 나중에 관리하기가 용이합니다.)

중요한 부분은

<string name="AdMobID">ca-app-pub-4681470946279796/9940497268</string>

이부분입니다. 이제 AdMobID 로 광고를 적용하게됩니다.

이제 실제 보이는 화면에서 구글 광고의 위치를 잡아 보겠습니다.

Main.axml 파일로 이동합니다.

아래 처럼 코딩합니다.

TextView 에서는 단순하게 Text 를 표시해 주고 그 Text 바로 아래에 구글 광고 베너가 표시되도록 하였습니다.

여기서 중요한 부분은 아래 굵게 표시된 부분입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="
http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="@string/Hello"
        android:layout_width="wrap_content"
        android:id="@+id/content"
        android:layout_height="wrap_content" />
    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/AdMobID" />

</LinearLayout>

파란색 부분이 앞서 광고 ID 로 지정했던 변수 이름을 넣어야합니다. (직접 광고 ID 를 넣어도 상관없습니다.)

이제 MainActivity 에 추가 코딩을 해야합니다.

    [Activity(Label = "AdMob", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected AdView mAdView;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);

            mAdView = FindViewById<AdView>(Resource.Id.adView);
            var adRequest = new AdRequest.Builder().Build();
            mAdView.LoadAd(adRequest);

        }
        protected override void OnResume()
        {
            base.OnResume();
            if (mAdView != null)
            {
                mAdView.Resume();
            }
        }

    }

마지막으로 인터넷을 이용해 광고 정보를 가져와야하므로 권한설정이 필요합니다.

아래처럼 프로젝트 속성의 Android 매니페스트 에서 ACESS_NETWROK_STATE, INTERNET 권한을 체크해야합니다.

모든 설정은 끝났습니다.

 

시뮬레이터로 실행하거나 안드로이드 폰으로 실행하면 아래 처럼 광고베너가 삽입된걸 볼수 있습니다.

 

소스는 아래에 있습니다.

https://github.com/knagjun/AdMob

 

도움이 되셨으면 공감 부탁드립니다.^^

Xamarin.Android 에 광고 넣는 방법을 소개합니다.

이번 시간에는 AdMob 에서 광고 ID 를 얻는 방법입니다.

우선 AdMob 에 가입을 합니다.

https://www.google.com/admob/

구글 로그인 해서 가입을 진행해야합니다.

가입 완료 후 수익창출 을 선택합니다.

여기서 좌측 상단의 빨간색 버튼 '새로운 앱에서 수익 창출' 을 클릭합니다.

아직 구글 플레이에 배포된 앱이 없다면 앱 직접 추가를 선택하고 이름을 넣습니다.

ANDROID 플랫폼을 선택합니다.

이름을 넣으면 아래처럼 앱추가 버튼이 활성화 됩니다.

앱추가를 클릭합니다.

광고 형식을 선택합니다. 배너를 선택합니다.

당연히 광고 크기가 크면 클수록 수익성이 좋을테지만 광고가 크면 클수록 사용자가 줄어들수도 있습니다.

 

광고 단위 이름을 넣고 저장 버튼을 클릭합니다.

애널리틱스는 건너뛰기 합니다. (필요하신 분을 사용하셔도 됩니다 _ 사용방법은 알아서^^)

아래 광고 단위 ID 가 생성되었습니다. 요놈을 잘 복사해 둡니다.

아래 목록에 광고 단위가 추가 된걸 확인 할수 있습니다.

 

다음 포스팅때 광고 ID를 가지고 XAMARIN.ANDROID 에 적용해보겠습니다.

+ Recent posts