質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

android Api 28でのSupport Library API 27の使用方法について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 9,275

laravel5

score 16

前提・実現したいこと

[Android] バックグラウンドでGPSログを取り続けるには
https://akira-watson.com/android/gps-background.html
を参考に、サンプルコードを入力し実行しようとするMainActivity.javaでインポートした
下記でシンボルが見つかりませんとエラーが発生しました。

import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;

該当のソースコード

https://stackoverflow.com/questions/51370352/failed-to-resolve-com-android-supportappcompat-v728-error-more-than-one
を参考にbuild.gradeを修正

build.grade

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"
    defaultConfig {
        applicationId "com.example.aimlive.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    testImplementation 'junit:junit:4.13-beta-3'
    implementation 'com.android.support:appcompat-v7:28.+'
    androidTestImplementation 'androidx.test:runner:1.2.0-beta01'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01'
    implementation 'androidx.appcompat:appcompat:1.0.0'
}

試したこと

import android.support.v7.app.AppCompatActivity が見つからないとき
https://kohei.kaneta.net/2018/02/import-androidsupportv7appappcompatacti.html

を参考にbuild.gradeに

implementation 'com.android.support:appcompat-v7:27.0.2'


を追加しましたが、versionが合わないとエラーが出た為、
### 該当のソースコードに記載している方法で再度build.gradeを修正しました。
修正後、syncするとimplementationしたsupport:appcompatの箇所の赤線が消え
buildを行うと、android.support.v4、android.support.v7を認識しない旨の
下記のエラーが発生しました。

イメージ説明

api 28では、
android.support.v4
android.support.v7
を使うべきかと
使用すべきであれば、使用方法等をご教授お願い致します。
使用しない方が良い場合は、実装方法をご教授お願い致します。

補足情報(FW/ツールのバージョンなど)

MAC OS Mojave Ver 10.14.4

Android stadio Version 3.4.1

Sync結果
イメージ説明

プロジェクト立ち上げ
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

build.gradleの内容が不思議なことになっています。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    testImplementation 'junit:junit:4.13-beta-3'
    implementation 'com.android.support:appcompat-v7:28.+'
    androidTestImplementation 'androidx.test:runner:1.2.0-beta01'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01'
    implementation 'androidx.appcompat:appcompat:1.0.0'
}


これ、従来のSupport Libraryと、今後の標準となるAndroid Jetpackによるライブラリーがごちゃまぜになっていますね。まずJetpackを使うのか使わないのか、どちらかに統一する必要があります。また、直接的には関係しないでしょうがbeta版のパッケージが含まれていたりなど、混沌とした状態になっています。

Android Studio 3.4.1で、参考にされたページの通りに作ってみましたが、build.gradleはプロジェクト作成時の状態からminSdkVersionを26に変更(API 26で追加されたAPIが存在するため)しただけで動作させることができました。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.gpslogger"
        minSdkVersion 26
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Support Libraryは、一つのモジュールの中ではすべて同じバージョンで統一されないとエラーになります。作るプログラムによっては、appcompat-v7以外のSupport Libraryを追加する必要がありますが、その場合もバージョンは同じにする必要があります。ですから、「API 28のライブラリーとAPI 27のライブラリーを混在させる」ということはできません

もっとも、今回のプロジェクトの場合、appcompat-v7の記述だけですべて解決できるようなので、そこを考慮する必要はないのですが。


わざとMainActivity.javaにエラーを発生させたときのコードエディターのタブの状態です。このように、MainActivity.javaというファイル名の下に赤波線が引かれるはずなのですが。

わざとMainActivity.javaにエラーを発生させたときのタブ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/19 19:12

    ご丁寧にUse androidx.*artifactsの解説有難う御座います。
    Android Studio 3.5〜は、Android Jetpackのチェックがデフォルトになるということなので、
    今回のサンプルもそうですが、今後は出来るだけAndroid Jetpackを使用して書き換えて言った方が良いのでしょうか?
    ※ Support Library API 27を使用する理由は過去端末までサポートできるようにする為と
    他のサイトに記載されておりましたので、過去端末は切り捨てる前提で
    Android Jetpackで開発をして方が良いのかと思いました。

    キャンセル

  • 2019/05/19 20:56

    > Support Library API 27を使用する理由は過去端末までサポートできるようにする為
    それはどこに書いてあったことですか?

    Support Libraryやandroidxを用いて作ったプログラムは、基本的に過去のAndroidバージョンの端末でも動作はします。ただ、今回のように特定APIレベルで追加された新機能を利用するために、build.gradleのminSdkVersionによってインストールできる端末のバージョンを制約することはあります。それは今までも今後も変わらないことです。

    キャンセル

  • 2019/05/21 00:11

    回答有難う御座います。
    > Support Library API 27を使用する理由は過去端末までサポートできるようにする為
    それはどこに書いてあったことですか?
    記載されていたサイトURL保存していなかった為、探し回ったのですが、
    みつかりませんでした。
    そのサイトには記載していた為、勘違いして理解しておりました。
    Support Libraryやandroidxを用いて作ったプログラムは過去のversionでも動作するのですね!
    知りませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる