4

Play ストアにアプリをアップロードしましたが、ウイルスが含まれており、モバイルが強制的に再起動されることがあるというコメントをいくつか受け取りました。私のアプリのコードはとてもシンプルです。いくつかのスポットがあり、それらを聞くか、着信音として設定できる 1 つのアクティビティのみです。何か提案できますか?

私のアプリのコード:

b1_2.setOnClickListener(new View.OnClickListener() {
  public void onClick(View v) {
    if(saveas(soundid,save_name)){
      Toast.makeText(Main.this, "The sound was set as ringtone!",
        Toast.LENGTH_LONG).show();
    };
  }
});
public boolean saveas(int ressound,String filename){
  byte[] buffer=null;
  InputStream fIn = getBaseContext().getResources().openRawResource(ressound);
  int size=0;
  try {
    size = fIn.available();
    buffer = new byte[size];
    fIn.read(buffer);
    fIn.close();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    return false;
  }
  String path="/sdcard/media/ringtones/";
  boolean exists = (new File(path)).exists();
  if (!exists){new File(path).mkdirs();}
  FileOutputStream save;
  try {
    save = new FileOutputStream(path+filename);
    save.write(buffer);
    save.flush();
    save.close();
  } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    return false;
    } catch (IOException e) {
      // TODO Auto-generated catch block
      return false;
    }
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
      Uri.parse("file://"+path+filename)));
    File k = new File(path, filename);
    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, "clip_"+save_name);
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.ARTIST, "clip");
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
    values.put(MediaStore.Audio.Media.IS_ALARM, true);
    values.put(MediaStore.Audio.Media.IS_MUSIC, true);
    //Insert it into the database
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
    getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" +
      k.getAbsolutePath() + "\"", null);
    Uri newUri= this.getContentResolver().insert(uri, values);
    RingtoneManager.setActualDefaultRingtoneUri(
      this, RingtoneManager.TYPE_RINGTONE, newUri);
    return true;
  }

必要な権限は次のとおりです。

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
     <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

インターネットなしで動作しますが、Google Playストアの開発者ページへの直接リンクがあり、クラッシュを回避するために次の機能を使用しました:

(if link is pressed)
  if (isOnline()){
    open page
} else {
  do nothing
}
public boolean isOnline() {
        boolean connectedWifi = false;
        boolean connectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] networks = cm.getAllNetworkInfo();
        for (NetworkInfo ni : networks) {
            if ("WIFI".equalsIgnoreCase(ni.getTypeName()))
                if (ni.isConnected())
                    connectedWifi = true;
            if ("MOBILE".equalsIgnoreCase(ni.getTypeName()))
                if (ni.isConnected())
                    connectedMobile = true;
        }
        return connectedWifi || connectedMobile;
    }
4

1 に答える 1

2

まず第一に、あなたの Android アプリが「ウイルスに感染している」という概念はばかげています。アプリに悪意のあるコードが含まれている場合、それは悪意のあるコードを含むアプリを開発したことが原因です。

ここで発生する可能性が高いのは、アプリにバグがあることです。さらに悪いことに、ユーザーが使用している Android SDK にもバグがあります (OS がクラッシュしているため、クラッシュすることはありません)。すべてのコードを調べて分析しないと、コードや Android SDK のどこにバグがあるかについて、ここにいる誰かが直接答えを出すのはかなり難しいでしょう。

このバグが発生したデバイスと SDK のバージョンを特定し、それらのデバイス/SDK でアプリのテストを開始することをお勧めします。バグはインターネット接続に関連している可能性があると思われるため、インターネット接続を有効、無効、および弱い接続でアプリをテストします。以前の Android SDK で既知のバグが発生している可能性があることに注意してください。

Crittercism (または別の同様のライブラリ) をインストールして次のバージョンを起動し、クラッシュを追跡することもできます。

于 2012-07-18T01:17:05.883 に答える