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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2830閲覧

Android studio MainActivityから別のクラスを呼び出す処理【LINE notify】

rockey_7625

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/10/11 06:51

android studioによるアプリ制作を行っているのですが、LINE notifyを使用し自作アプリ画面上のボタンを押したら固定のメッセージをスマホのLINEhへ送るようにしたいと考えております。
コードを書き終えいざ実行しますが、うまくいきません。
どうも別のクラスからの呼び出し部分がうまくいってないようなのですが、どこがおかしいか見つけきれず。。。
今まで別のクラスを呼び出す動きをやった事がなかったので慣れていない事もあるのですが、宜しければ間違い・ミスを指摘頂けると助かります。
すいませんが、よろしくお願い致します。

--MainActivity.java-- import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { private LineNotify classln; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); classln = new LineNotify(); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String str = classln.name(); } }
--LineNotify.java-- import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.Objects; import java.util.stream.Collectors; public class LineNotify { public static void main(String[] args) { String トークン = "****ここにアクセストークンを入れる****"; LineNotify lineNotify = new LineNotify(トークン); lineNotify.notify("lineテスト"); lineNotify.notify("Test signal"); } private final String token; public LineNotify(String token) { this.token = token; } public void notify(String message) { HttpURLConnection connection = null; try { URL url = new URL("https://notify-api.line.me/api/notify"); connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.addRequestProperty("Authorization", "Bearer " + token); try (OutputStream os = connection.getOutputStream(); PrintWriter writer = new PrintWriter(os)) { writer.append("message=").append(URLEncoder.encode(message, "UTF-8")).flush(); try (InputStream is = connection.getInputStream(); BufferedReader r = new BufferedReader(new InputStreamReader(is))) { String res = r.lines().collect(Collectors.joining()); if (!res.contains("\"message\":\"ok\"")) { System.out.println(res); System.out.println("失敗"); } } } } catch (Exception ignore) { } finally { if (connection != null) { connection.disconnect(); } } } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; LineNotify that = (LineNotify) o; return Objects.equals(token, that.token); } @Override public int hashCode() { return Objects.hash(token); } @Override public String toString() { return "LineNotify{" + "token='" + token + '\'' + '}'; } }
--Manifest.xml-- <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.e.testsignalapplication"> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LINE notifyについては全く知見がないのでその内容については何も言えませんが、プログラムの作り方については大いに問題があります。Android SDKを用いて作成するAndroidアプリケーションのプログラミングでは、通常のJavaプログラムと異なりpublic static void main()から始まるプログラムを作ることはできません。SDKの作法に則ったプログラムの作り方に改修する必要があります。

また、やはりAndroidアプリケーション開発の縛りとして、UIを操作するスレッド(メインとなるスレッド)でネットワーク通信をすることもできません。Threadなどを用いてネットワーク通信するための別スレッドで処理する必要があります。なお、Andoroidアプリのプログラミングで別スレッド処理の方法を調べるとAsyncTaskというクラスを用いる方法が多数ヒットすると思いますが、このクラスはAPIレベル30で非推奨となったため、別の手段を用いるべきです。


別スレッドで処理するThreadのコード自体はどこに記載すればよいのでしょうか?

設計次第ではありますが、LineNotifyクラスの中に記述すればいいのではないでしょうか。

一例として

java

1class LineNotify { 2 private static final String token = "****ここにアクセストークンを入れる****"; 3 4 public void notify(String message) { 5 Comm t = new Comm(message); 6 t.start(); 7 } 8 9 static class Comm extends Thread { 10 private String message; 11 12 Comm(String message) { 13 this.message = message; 14 } 15 16 @Override 17 public void run() { 18 // 現状のNotify()メソッドにあるネットワーク通信の処理をここに記述 19 } 20 } 21 22 (以下略) 23 24}

呼び出すMainActivity.javaの側では

java

1 button.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 classln.notify("lineテスト"); 5 classln.notify("Test signal"); 6 } 7 });

のようにnotify()の引数に送りたい文字列をセットすればいけるのではないかと。

投稿2020/10/11 15:22

編集2020/10/13 14:33
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockey_7625

2020/10/12 12:25

アドバイスありがとうございます。 すいませんが、ネットワーク通信がメインスレッドでは不可は理解しましたが、別スレッドで処理するThreadのコード自体はどこに記載すればよいのでしょうか? 通常のMainActivity.java内に記載してよいのでしょうか? この手の技術についてはまだ知識不足でしてアドバイス頂けたら幸いです。
rockey_7625

2020/10/14 11:56

ありがとうございます! 先ほどアドバイスを元にコード修正したらうまくいきました!!【通信成功】 長い闘いでした。。。。【3週間ほどずっとコードを修正→ビルド→修正。。。の繰り返しでした。。】 別のクラスからの呼び出し処理も併せて勉強できました。 誠にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問