読者です 読者をやめる 読者になる 読者になる

ともちゃんのAndroid開発日記

組込みC言語プログラマだったともちゃんが、四苦八苦しながら、AndroidのJAVA言語を習得して行きます。ともちゃんの備忘録も兼ねています。

Androidアプリの課金テストのアカウント

課金テスト用のアカウントは、Google Play Consoleの

[設定]→

[テスタの管理]

だけでなく、

[設定]→

[アカウントの詳細]→

[テスト用のアクセス権がある Gmail アカウント]

にも登録しないと、課金されてしまいます。

Android 6.0のRuntime Permission

Android 6.0のRuntime Permissionの取得方法です。

 

1.Activityで実行する例

ストレージのアクセス権を得る場合の例です。

if (ContextCompat.checkSelfPermission(ExportImportActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// アクセス権がすでに付与されているときの処理
} else {
// アクセス権を付与する処理
ActivityCompat.requestPermissions(ExportImportActivity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
}

 

  ユーザが許可/不許可を選択したときの処理

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case 0: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//許可された場合の処理
}
break;
}
}
}

 

2.Fargmentで実行する例

ストレージのアクセス権を得る場合の例です。

    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// アクセス権がすでに付与されているときの処理
} else {
// アクセス権を付与する処理
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag("ExportImport");
FragmentCompat.requestPermissions(fragment, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
}
} else {
// Android 6.0未満の時
}

 

 ユーザが許可/不許可を選択したときの処理

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case 0: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//許可された場合の処理
}
break;
}
}
}

 

 

AChartEngineで円グラフを描く

AChartEngineで円グラフを描く

public void displayPieChart(
int dataCount,
String label[],
int data[],
int kind
) {

Resources resources = context.getResources();

if (dataCount == 0) {
chartLayout.removeAllViews();
return;
}

CategorySeries series = new CategorySeries(null);

String actualLabel = "";
for (int i=0; i<dataCount; i++) {
actualLabel = label[i] + "(" + String.valueOf(data[i]) + resources.getString(R.string.yen) + ")";
series.add(actualLabel, data[i]);
}

DefaultRenderer renderer = new DefaultRenderer();

renderer.setShowLabels(false); //ラベルを表示するか
// renderer.setLabelsTextSize(15); //ラベルの文字サイズ
renderer.setShowLegend(true); //凡例を表示するか
renderer.setLegendTextSize(24); //凡例の文字サイズ
//データの数字を表示する or しないを指定。デフォルトは表示しない
renderer.setDisplayValues(false);
//スタートの角度を指定。デフォルトでは、3時の方向。12時の方向からスタートの場合は270を指定。
renderer.setStartAngle(270);
// スクロール禁止
renderer.setPanEnabled(false);
// ズーム禁止
renderer.setZoomEnabled(false);

String[] colors = {
"#F44336", // Red
"#E91E63", // Pink
"#9C27B0", // Purple
"#673AB7", // Deep Purple
"#3F51B5", // Indigo
"#2196F3", // Blue
"#03A9F4", // Light Blue
"#00BCD4", // Cyan
"#009688", // Teal
"#4CAF50", // Green
"#AED581", // Light Green
"#CDDC39", // Lime
"#FFEB3B", // Yellow
"#FFC107", // Amber
"#FF9800", // Orange
"#FF5722", // Deep Orange
"#795548", // Brown
"#9E9E9E", // Gray
"#607D8B", // Blue Gray
};

DatabaseManager databaseManager = new DatabaseManager();
for (int i=0; i<dataCount; i++) {
SimpleSeriesRenderer seriesRenderer = new SimpleSeriesRenderer();
if (kind == databaseManager.DB_KIND_SPENDING) {
seriesRenderer.setColor(Color.parseColor(colors[i % colors.length]));
} else {
seriesRenderer.setColor(Color.parseColor(colors[(colors.length-1)-(i % colors.length)]));
}
renderer.addSeriesRenderer(seriesRenderer);
}

GraphicalView mChartView = ChartFactory.getPieChartView(context, series, renderer);
chartLayout.removeAllViews();
chartLayout.addView(mChartView);

}

 

 

Google Playでapkの公開に時間がかかった

Google Playでアプリの公開に時間がかかりました。

36時間経っても公開されず、さすがにおかしいと思い、バージョンコードを一つ上げて、apkをアップデートしました。

そうすると、何事も無かったかのように、2時間後くらいに新バージョンコードのapkが公開されました。

 

端末起動時の時間のかかる処理

端末起動時に処理を動かすには、

android.intent.action.BOOT_COMPLETED

をキャッチしてやります。

public class BootBroadcastReceiver extends BroadcastReceiver {

Context context;

@Override
public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {

DataCenter dataCenter = new DataCenter();
dataCenter.setContextNotificationScheduleOnBoot(context);

Intent notificationScheduleOnBoot = new Intent(context, NotificationScheduleOnBoot.class);
context.startService(notificationScheduleOnBoot);

}

}

}

 

 ただ、BroadcastReceiverの処理は、短い処理でないといけないので、処理が長くなる時は、IntentServiceを使用します。

public class NotificationScheduleOnBoot extends IntentService {

public NotificationScheduleOnBoot() {
super("NotificationScheduleOnBoot");
}

@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {

// 長くかかる処理

}
}

}

 

 

AsyncTaskのdoInBackgroundが途中終了する

AsyncTaskのdoInBackgroundが途中終了する現象に遭遇して四苦八苦しました。

AsyncTaskの呼び出し元のスレッドかActivityが終了すると、doInBackgroundも途中終了するような感じです。。

正確な記載でなくてすいません。

 

【挫折】Android 5.0でSDカードのタイムスタンプの変更が出来ない

ファイルマネージャで写真を移動すると、ファイルのタイムスタンプが移動した日になってしまうのに、常々不満を持っていました。

良いアプリを探しましたがありません。

ならば自分で作ってしまえ、と作り始めましたが、ダメです。出来ません。

Android 5.0以降の機種で、SDカードにアクセスする時に、ファイルのタイムスタンプを変更するAPIが用意されていないのです。

インターネットで色々なサイトを見ましたが、載っていません。STACK OVER FLOWにも何人か質問を載せていましたが、オープンのままです。

どないもならんのかいな?