이클립스에서 안드로이드 앱 개발툴을 안드로이드 스튜디오로 바꾸고 나서 에러 잡기가 힘들어 진 것 같네요~

 

Android resource linking failed

error: failed processing manifest.

 

위와 같은 에러로 빌드가 안되는데 인터넷 검색을 해봐도 명확한 답이 없더군요~

 

제 경우엔 카메라 관련해서 file_path.xml 파일을 만들어 둔게 있는데 머지 과정에서 누락된 상태에서 발생한 오류 였습니다.

 

좀 자세하게 해당 부분을 알려주면 좋을텐데 안드로이드 스튜디오에 적응하기 쉽지 않군요~

 

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

안드로이드 앱 강제 삭제 이후 재 등록시 몇번에 걸쳐서 거절 당했는데 겨우 등록되었네요~

기승전 보안서버더군요~

 

Hello Google Play Developer,

We rejected 앱이름, with package name com.example.www.appname, for violating our Malicious Behavior or User Data policy. If you submitted an update, the previous version of your app is still available on Google Play.

This app uses software that contains security vulnerabilities for users or allows the collection of user data without proper disclosure.

Below is the list of issues and the corresponding APK versions that were detected in your recent submission. Please upgrade your app(s) as soon as possible and increment the version number of the upgraded APK.

VulnerabilityAPK Version(s)Past Due Date

JavaScript Interface Injection

Your app(s) are using a WebView that is vulnerable to JavaScript interface injection.

To address this issue, follow the steps in this Google Help Center article.

13 January 31, 2019

To confirm you’ve upgraded correctly, submit the updated version of your app to the Play Console and check back after five hours to make sure the warning is gone.

 

http:// 주소를 https:// 보안서버로 변경해야 통과 시켜주네요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] Android 8.1 SDK 27 FCM PUSH 알림 문제


안드로이드 8.1 오레오 이상 버전에서 푸쉬는 오는데 알림 소리가 안울리는 문제가 있네요~

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class FCMMessageService extends FirebaseMessagingService {
private static final String TAG = "FCMMessageService";
static String registration_id = null;

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getData().size() > 0) {
sendNotification(remoteMessage.getData().get("message"));
}
}

private void sendNotification(String messageBody) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = null;
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "default_channel_id";
String channelDescription = "Default Channel";
NotificationChannel notificationChannel = notificationManager.getNotificationChannel(channelId);
if (notificationChannel == null) {
int importance = NotificationManager.IMPORTANCE_HIGH;
notificationChannel = new NotificationChannel(channelId, channelDescription, importance);
notificationChannel.setLightColor(Color.GREEN);
notificationChannel.enableVibration(true);
notificationManager.createNotificationChannel(notificationChannel);
}
notificationBuilder = new NotificationCompat.Builder(this, channelId);
} else {
notificationBuilder = new NotificationCompat.Builder(this);
}
notificationBuilder
.setSmallIcon(R.drawable.noti_icon)
.setContentTitle(getString(R.string.app_name))
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);

PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
wakelock.acquire(5000);
notificationManager.notify(0, notificationBuilder.build());
}
}

SDK 버전이 올라갈때 마다 가지가지 하네요~ ㅎ


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] FCM PHP 서버 PUSH



서버에서 PHP로 푸쉬메시지를 보내는 코드입니다.


[안드로이드] FCM PHP 서버 PUSH


이전에 사용하던 GCM 서버키를 바꿔주어야 합니다.


function fcm_send($regId, $sendMsg) {

$serverKey = 'AAA...';

$sendMsg = urldecode($sendMsg);

if(is_array($regId)) {

$tokens = $regId;

} else {

$tokens = array();

$tokens[] = $regId;;

}

$message = array( 'message' => $sendMsg );

$fields = array(

'registration_ids' => $tokens,

'data' => $message

);

$headers = array(

'Authorization:key='.$serverKey,

'Content-Type:application/json'

);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

$result = curl_exec($ch);

if($result === FALSE) {

$result = curl_error($ch);

}

curl_close($ch);

return $result;

}


잘되는군요~


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] API 23 앱 권한 설정


AndroidManifest.xml 에 있는 퍼미션 관련부분을 아래 코드에 적용하면 됩니다.

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

...

checkGranted();

}


@TargetApi(Build.VERSION_CODES.JELLY_BEAN)

public void checkGranted() {

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.INTERNET) ||

PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) ||

PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) ||

PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) ||

PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.READ_PHONE_STATE) ||

PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.VIBRATE) ||

PackageManager.PERMISSION_GRANTED != checkSelfPermission(Manifest.permission.CAMERA)

) {

requestPermissions(new String[]{

Manifest.permission.INTERNET,

Manifest.permission.ACCESS_NETWORK_STATE,

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.READ_PHONE_STATE,

Manifest.permission.VIBRATE,

Manifest.permission.CAMERA},1);

} else {

}

}

}

@Override

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == 1) {

if (grantResults.length > 0) {

for (int i=0; i<grantResults.length; ++i) {

if (grantResults[i] == PackageManager.PERMISSION_DENIED) {

new AlertDialog.Builder(this).setTitle("알림").setMessage("권한을 허용하셔야 앱을 이용할 수 있습니다.")

.setPositiveButton("종료", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

finish();

}

}).setNegativeButton("권한 설정", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

checkGranted();

}

}).setCancelable(false).show();

return;

}

}

}

}

}

API 버전이 올라가니깐 이래저래 참 귀찮게 만드네요~


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] FileUriExposedException 에러


아래와 같은 에러의 경우가 여러가지 원인이 있겠지만 카메라 촬영 후 앨범에서 여러장 선택해서 전달시 발생한 경우입니다.

E/AndroidRuntime(5472): android.os.FileUriExposedException: file:///storage/0000-0000/DCIM/Camera/20190304_113931_HDR.jpg exposed beyond app through Intent.getData()


이런 경우엔 아래 처럼 onCreate 에 넣어주니 에러가 안나는군요~

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); 

StrictMode.setVmPolicy(builder.build());

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

builder.detectFileUriExposure();

}

API 23 부터 너무 짜증이 나네요~


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] IllegalArgumentException root 에러


API 26 으로 올리고 구글 정책이 얼마나 바뀌었는지 짜증스럽네요~

E/AndroidRuntime(28534): java.lang.IllegalArgumentException: Failed to find configured root that contains


위와 같은 에러시 xml 파일에 아래와 같이 넣어주면 됩니다.


<?xml version="1.0" encoding="utf-8"?>

<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <external-path name="storage/emulated/0" path="."/>

    <root-path name="root" path="."/>

</paths>

하나 하나 풀어나가기 힘들군요~


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] WebView Uncaught TypeError


SDK API 26으로 올렸더니 기존에 잘 동작하던 코드가 제대로 먹히지를 않는군요~

구글이 왜그럴까요~ 점점 짜증나게 만드네요~

버전을 올리면 하위 버전도 호환되게 해야지 제거된 API 들이 은근 많아서 스트레스 받네요~

자바는 이래서 싫어요~

I/chromium(15940): [INFO:CONSOLE(15)] "Uncaught TypeError: window.WebViewCall.setMessage is not a function", source:


위와 같은 메시지가 나오면 아래 처럼 색깔이 들어간 부분을 넣어주면 됩니다.


import android.webkit.JavascriptInterface;

...

mWebView.addJavascriptInterface(new WebViewCall(), "WebViewCall");

...

public class WebViewCall {

@JavascriptInterface

public void setMessage(final String arg, final String arg2) {

...

}

별거 아닐 걸로 환장하는군요~ ㅎ


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] Android Studio gradle 에러


eclipse 에서 안드로이드 스튜디오로 개발툴을 바꾸고 적응하기 힘드네요~

"Could not find com.android.tools.build:gradle:3.3.1." 에러시 File -> Project Structure -> Project 에서 아래 처럼 해주니깐 됩니다.

[안드로이드] Android Studio gradle 에러

이런 오류는 구글링도 이제 힘드네요~


블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

[안드로이드] Android Studio non-ASCII 에러


기존의 eclipse 에서 개발된 앱소스를 안드로이드 스튜디오에서 import 하려고 하니 아래 처럼 에러가 나면서 불러오지를 못하네요~

"Your project file contains non-ASCII characters."

[안드로이드] Android Studio non-ASCII 에러

이클립스에서는 폴더명이 한글이 있더라도 되던게 안드로이드 스튜디오에서는 안되는가 봅니다.

Google 드라이브 폴더명을 영문으로 바꾸고 불러오니 잘 되는군요~



블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,