Android 패키지 파일을 분할하는 중에 문제가 발생하였습니다.

Android 앱 개발중 Release 버젼으로 .apk 파일을 생성해 모바일에 직접 설치하고싶을때

“패키지 파일을 분할하는 중에 문제가 발생하였습니다” 라는 에러가 나면서 설치되지 않는다면

APK 파일의 minSdkVersion (개발중인 안드로이버젼)이
설치되는 폰의 Android Version보다 높기때문입니다.

반대로 얘기하면, 실행하려는 폰이 개발된 앱보다 버젼이 낮기 때문입니다.

Manifest.xml 을 열어보면 최소/목표사양의 Android Version을 지정할 수 있습니다.

다음과 같은 방법을 시도해 볼 수 있습니다.

  1. 개발중인 Minimum Android Version 을 더 낮춘다.
  2. Compile, Target Android Version 을 설치할 폰과 맞춘다.
  3. 테스트할 폰의 Android OS를 빌드 버젼 또는 더 높게 업그레이드를 한다.

보통의 경우 설치할폰에 설정에 들어가서 Android버젼을 먼저 확인한후
개발툴로 돌아와 개발 버젼을 폰에 맞게 맞춰주시면 대부분 해결이 가능합니다.

123.PNG

<Android Studio에서는 AndroidManifest.xml의 <users-sdk> 항목이 해당됩니다

형식

<users-sdk android:minSdkVersion="integer"
           android:targetSdkVersion="integer"
           android:maxSdkVersion="integer"/> 

안드로이드 스튜디오에서는 버젼을 번호로 입력해야합니다. 아래 표를 참고해주세요.

예를 들면 안드로이드 롤리팝 버젼(21)으로 개발했는데 폰이 허니콤(11)이면 패키지파일을 제대로 설치할수없다는 것입니다.

123.PNG

<Xamarin Studio에서는 AndroidManifesto 를 UI 를 이용해 수정할수있습니다.>

123.PNG

 

Advertisements

XNA 4.0 SpriteBatch.begin() 과 end() 사용법 (Xamarin)

Xamrin XNA 4.0 에서 SpriteBatch를 사용해 Draw() 실행전에

AlphaBlending 또는 정렬모드를 설정할 수 있는데요. 문제는 다음과 같은 에러가 날때가 흔합니다.

System.InvalidOperationException: Begin cannot be called again until End has been successfully called.

해결방법은

1. spriteBatch.Begin(); 과 End();가 중복사용되지 않았는지 확인해보고

2. spriteBatch.Begin() 효과를 사용하기 위해서는
DepthStencilState에서 DepthbufferEnable 을 활성화시켜줘야 합니다.

다시말해 Depth Buffer 없이는 오브젝트간에 깊이를 구성할수 없다는 것입니다.

코드 사용예제

SpriteBatch spriteBatch;
spriteBatch = new SpriteBatch(GraphicsDevice);

protected override void Draw(GameTime gameTime)
{
   spriteBatch.Begin(SpriteSortMode.Immediate, 
                     BlendState.AlphaBlend, 
                     SamplerState.LinearWrap, 
                     DepthStencilState.Default); // Begin
   btnMenu.Draw(spriteBatch, rectangle_menu); // 버튼그리기
   spriteBatch.End(); // End

이렇게 사용하는데 에러가 난다면
다음코드를 메인 Class 에 추가해서 시도해보세요.

DepthStencilState stencilState = new DepthStencilState();
public Game1()
{
   stencilState.StencilEnable = true;
   stencilState.StencilFunction = CompareFunction.Always;
   stencilState.StencilPass = StencilOperation.Replace;
   stencilState.ReferenceStencil = 1;
   stencilState.DepthBufferEnable = true;
}

마지막 부분 DepthBufferEnable = ture 가 중요합니다.

Android – Xamarin Button Click

Xamarin 자마린에서 안드로이드 앱개발시 버튼을 사용하는방법입니다.

1. 버튼을 Layout ID에서 찾아 지정해줍니다.

Button btn = (Button)FindViewById(Resource.Id.button1);

2. 지정된 버튼에 Click 이벤트를 정의합니다. C# 은 delegate을 사용합니다.
{} 사이에 실행될 명령어를 넣어줍니다(액티비티실행, 텍스트표시, 등등). 여기서는 Game1 을 실행합니다.

btn.Click += delegate
{
   var g = new Game1();
   SetContentView((View)g.Services.GetService(typeof(View)));
   g.Run();
};

전체적인 OnCreate() 메소드입니다.

protected override async void OnCreate(Bundle bundle)
{
     base.OnCreate(bundle);

     // Set the layout
     SetContentView(Resource.Layout.Main);

     // Button
     Button btn = (Button)FindViewById(Resource.Id.button1);

     // Button Click events
     btn.Click += delegate
     {
          var g = new Game1();
          SetContentView((View)g.Services.GetService(typeof(View)));
          g.Run();
     };
}

Android OnActivityResult

안드로이드에서 액티비티의 결과로 다음코드를 진행하고자 할때는 다음과 같이합니다.

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
   base.OnActivityResult(requestCode, resultCode, data);
   if (resultCode == Result.Ok)
   {
        var helloLabel = FindViewById (Resource.Id.helloLabel);
        helloLabel.Text = data.GetStringExtra("greeting");
    }
}

        

Android 인텐트(Intent) 사용해서 액티비티 전환하기

How to transfer data between activities.

  • 인텐드를 만들고 Create Intent
  • 인튼드를 사용해서 편지처럼 주고 받는다. Use “Intent” to send / receive data.
  • 보낼때는, When you send data,

    intent.putExtra();

  • 받을때는, When you receive data,

    intent.getExtra();

다른표현으로 인텐트는 하나의 택배회사입니다. 주는쪽 받는쪽 모두 택배회사가 있어야하므로 오브젝트를 생성해주고 Extra라는 이름의 소포에 이름을 붙여 보내고 받는 식입니다. (putExtra, getExtra)

보내는 액티비티 예제 Send (A Activity)

public class A extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.chat);

Intent intent = new Intent(this, B.class);   // B.class로 가는 인텐드 오브젝트 생성
intent.putExtra(“name”, “Dongyeop Lee”); // 인텐드에 name 이라는 키로 데이터저장
startActivity(intent); //인텐드를 전송하며 다음 액티비티 시작

}

}

받는 액티비티 예제 Receive (B Activity)

public class B extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.chat);

Intent intent = getIntent(); // B.class 안에서 받는 인텐드 오브젝트 생성
String name = intent.getExtras().getString(“name”); // name 이라는 키값을 가진 데이터를 인텐드에서 받아 스트링으로 메모리에 저장

Toast.makeText(this, “Name : ” + name, Toast.LENGTH_LONG).show();

}

}